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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bernd (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
3 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.