C++ Membervariablen vom Typ string initialisieren

Gast #6489692
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?
Beitrag #6489695 wurde von einem Moderator gelöscht.
#6489961
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
Beitrag #6490789 wurde von einem Moderator gelöscht.
Gast #6490873
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?
#6490892
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!
Gast #6490930
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.
#6490952
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.
Beitrag #6492869 wurde von einem Moderator gelöscht.
Beitrag #6493889 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren