Forum: PC-Programmierung C++ Membervariablen vom Typ string initialisieren


von Bernd (Gast)


Lesenswert?

Hallo Forum!

Ist es nötig bei C++, Membervariablen vom Typ string zu initialisieren?

Hier ein kurzes Beispiel zu Erklärung:
1
#include <string>
2
#include <iostream>
3
4
using namespace std;
5
6
7
class TestClass
8
{
9
    public:
10
        TestClass();
11
        string  get_value();
12
        void    set_value( string value);
13
    private:
14
        string  m_string;
15
};
16
17
18
TestClass::TestClass()
19
{
20
    m_string = ""; // <- nötig oder nicht?
21
}
22
23
string  TestClass::get_value()
24
{
25
    return m_string;
26
}
27
28
void    TestClass::set_value( string value)
29
{
30
    m_string = value;
31
}
32
33
34
int main(int argc, char* argv[])
35
{
36
    TestClass a;
37
38
    cout << "Test -->" << a.get_value() << "<--" << endl; 
39
}
Auch ohne die Initialisirung von m_string im Konstruktor funktioniert es 
bei mir so wie es soll. Aber ist das immer und überall so?

: Verschoben durch Moderator
Beitrag #6489695 wurde von einem Moderator gelöscht.
von Mark B. (markbrandis)


Lesenswert?

Der default constructor sorgt dafür, dass der String als ein leerer 
String mit einer Länge von null Zeichen initialisiert wird:

http://www.cplusplus.com/reference/string/string/string/

von Bernd (Gast)


Lesenswert?

Aha, Danke.
D.h. ich muß nur bei den nativen Datentypen (und deren Arrays) 
aufpassen: https://en.cppreference.com/w/cpp/language/types
der Rest wird von den jeweiligen Konstruktoren erledigt.

P.S.: Und auch ein Dankeschön an die Moderation!

von Oliver S. (oliverso)


Lesenswert?

Bernd schrieb:
> Aha, Danke.
> D.h. ich muß nur bei den nativen Datentypen (und deren Arrays)
> aufpassen: https://en.cppreference.com/w/cpp/language/types
> der Rest wird von den jeweiligen Konstruktoren erledigt.

Niemand zwingt irgendjemanden dazu, Software so zu schreiben, wie du es 
erwartest. Du musst immer aufpassen, und nachlesen oder -schauen, was 
der jeweilige default-Konstruktor macht. Das kann, wie im Fall von 
std::string, das sein, was du erwartest, es muß aber nicht so sein.

Oliver

von Wilhelm M. (wimalopaan)


Lesenswert?

Bernd schrieb:
> TestClass::TestClass()
> {
>     m_string = ""; // <- nötig oder nicht?
> }

Das ist keine Initialisierung.

>
> string  TestClass::get_value()
> {
>     return m_string;
> }

Das ist kein "getter" (Beobachter) wie der Name suggeriert.

Beitrag #6490789 wurde von einem Moderator gelöscht.
von Bernd (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Bernd schrieb:
>> TestClass::TestClass()
>> {
>>     m_string = ""; // <- nötig oder nicht?
>> }
> Das ist keine Initialisierung.
Was ist es dann?

>> string  TestClass::get_value()
>> {
>>     return m_string;
>> }
> Das ist kein "getter" (Beobachter) wie der Name suggeriert.
Wie würde ein "richtiger" Getter aussehen?

von Wilhelm M. (wimalopaan)


Lesenswert?

Bernd schrieb:
> Wilhelm M. schrieb:
>> Bernd schrieb:
>>> TestClass::TestClass()
>>> {
>>>     m_string = ""; // <- nötig oder nicht?
>>> }
>> Das ist keine Initialisierung.
> Was ist es dann?

Eine Typumwandlung und Kopierzuweisung.

Expl. Initialisieren macht man in einer Initialisierungsliste mit 
Elementinitialisierern. Hier aber unnötig, da ja std-ctor verwendet wird 
-> leerer String.

>
>>> string  TestClass::get_value()
>>> {
>>>     return m_string;
>>> }
>> Das ist kein "getter" (Beobachter) wie der Name suggeriert.
> Wie würde ein "richtiger" Getter aussehen?

Naja, eben const!

von Bernd (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Bernd schrieb:
>> Wilhelm M. schrieb:
>>> Das ist keine Initialisierung.
>> Was ist es dann?
>
> Eine Typumwandlung und Kopierzuweisung.
>
> Expl. Initialisieren macht man in einer Initialisierungsliste mit
> Elementinitialisierern.
Ok. Soweit bin ich noch nicht. Da ich (viel) zu selten in C++/Qt 
programmiere, versuche ich nur Sprachkonstrukte zu verwenden, die ich 
auf Anhieb verstehe.

>>> Das ist kein "getter" (Beobachter) wie der Name suggeriert.
>> Wie würde ein "richtiger" Getter aussehen?
> Naja, eben const!
Ja, ok. So kann ich mit deiner Antwort was anfangen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Bernd schrieb:
> Ok. Soweit bin ich noch nicht.

Der Unterschied zwischen Initialisierung und Zuweisung sollte aber 
bekannt sein. Sonst brauchst Du gar nicht weiter zu machen.

Bernd schrieb:
>>> Wie würde ein "richtiger" Getter aussehen?
>> Naja, eben const!
> Ja, ok. So kann ich mit deiner Antwort was anfangen.

Die Vorsilbe "get" kannst Du Dir schenken, denn der Compiler prüft es 
für Dich, ob es eben tatsächlich nur ein Beobachter ist! Und das const 
ist eben Bestandteil der Signatur.

von Oliver S. (oliverso)


Lesenswert?

Wilhelm M. schrieb:
> Die Vorsilbe "get" kannst Du Dir schenken,

Was dann direkt zum Parallelthread über C++-Namenskonventionen führt...

Oliver

Beitrag #6492869 wurde von einem Moderator gelöscht.
Beitrag #6493889 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.