I definiert Visual Studio bin mit 2013C++ Benutzer leer Standardkonstruktors vs impliziten oder default-ed Standardkonstruktors
Ich habe den folgenden Code
class Foo{
public:
Foo(){};
Foo* fPtr;
float f;
};
int main()
{
Foo foo1; // No Warning. fPtr is initialized to NULL, f is set to 0.0.
Foo foo2(foo1); // Compiles fine. Uses compiler generated copy constructor
return 0;
}
nun den gleichen Code betrachten, aber ohne den Benutzer definiert Standardkonstruktor.
class Foo{
public:
// No user defined default constructor, or equivalently
// Foo() = default;
Foo* fPtr;
float f;
};
int main()
{
Foo foo1; // Neither fPtr nor f are initialized, both contain garbage.
//Foo foo2(foo1); // error C4700: uninitialized local variable 'foo1' used
return 0;
}
Ich dachte, dass der Benutzer definiert Standardkonstruktor und der implizit Standardkonstruktors definiert äquivalent sind, aber es scheint mir, sind sie nicht.
Wie genau arbeitet der Compiler Standardkonstruktor?
Nach diesem Fall bin ich vorsichtig gegen die Verwendung von Compiler definierten Standardkonstruktoren und immer meine eigenen, obwohl manchmal leer Standardkonstruktoren. Versteh ich etwas falsch?
Ich verstehe nicht ganz, was Sie mit "Nein" meinen. Selbst für das erste Codebeispiel sind foo1.fPtr und foo1.f nicht initialisiert, der benutzerdefinierte Konstruktor tut nichts. ". Tatsache ist, dass im ersten Fall der benutzerdefinierte Konstruktor mit 'Foo foo1;' und 'Foo foo1 {}' aufgerufen wird und die Member korrekt auf ihre Standardwerte, d. H. NULL und 0, initialisiert werden.0, also nehme ich an, dass der benutzerdefinierte Konstruktor tatsächlich etwas tut. –
@Hrachya_h Nein, sie sind nicht initialisiert, zum Beispiel http://rextester.com/JVFH58493. – songyuanyao
'Foo foo1;' Initialisiert NICHT die Member in beiden Beispielen, da keine Initialisierung vorhanden ist. Wenn sie auf Nullen initialisiert werden, ist es ein zufälliges undefiniertes Verhalten des Compilers. Es ist NICHT garantiert in diesen Beispielen. –