2017-03-06 11 views
0

Unter Berücksichtigung der folgenden Klassendefinition:C++ Konstruktor implizite Mitglieder

class Foo {  
private: 
    int a; 
    int b; 

public: 
    Foo() : 
     a() 
    {} 
}; 

Wenn ich mich richtig erinnere, a() den Standardkonstruktor von int aufrufen und auf 0 initialisieren Wenn ich den Konstruktor auslassen, ist es nicht definiert, was passiert, zu den Mitgliedsvariablen. Aber was ist mit b in diesem Beispiel? Für meine Version von gcc scheint es auch auf 0 gesetzt zu sein, aber ist das definiertes Verhalten?

Vielen Dank für Ihre Antworten.

Antwort

3

b wird nicht initialisiert, daher verursacht der Versuch, UB zu verwenden (undefiniertes Verhalten). Es ist einfach passiert, dass Ihr Mitglied von gcc auf Null gesetzt wurde, aber Sie sollten sich nicht darauf verlassen.

In der Tat, wenn Sie mit allen Warnungen auf (-Wall -Wextra -Wpedantic) kompilieren, spuckt gcc aus

warning: 'foo.Foo::b' is used uninitialized in this function 

, wenn so etwas wie

cout << foo.b; // assuming b is public here 
Verwandte Themen