2016-07-06 18 views
2

Ich bin neu bei C++ und lerne gerade über Konstruktoren. Sagen, dass ich eine Klasse Hund mit einem Konstruktor:Instanziieren von Objekten ohne Aufruf des Konstruktors in C++

class Dog{ 
    Dog(){ 
     std::cout << "Constructor called! 
    } 
}; 

Ich weiß, dass in C++ gibt es verschiedene Möglichkeiten (wenn ich mich nicht irre) wir ein Objekt erstellen können, zum Beispiel:

1- Dog dog; 
2- Dog dog = Dog(); 
3- Dog *dog = new Dog; 
4- Dog *dog = new Dog(); 
5- Dog dog(); 

Aber hier ist die Sache: Aussagen von 1 bis 4 rufen alle den Konstruktor, aber die Aussage Nummer 5 nicht und ich kann herausfinden, warum.

Haben Sie eine Idee, warum die fünfte Anweisung den Konstruktor der Klasse nicht aufruft? Danke.

+4

5 ist ein Prototyp der Funktion, sehen am meisten ärgerlichen Parse. – sergej

+0

5 erstellt kein Dog-Objekt. – sergej

+2

@sergej Sie sollten Ihren Kommentar als Antwort hinzufügen. [Bearbeiten] Zu spät; HolyBlackCat hat dich dazu geschlagen. –

Antwort

5

5 ist ein Beispiel für C++ most vexing parse.

Dog dog(); 

Dies erklärt eine Funktion dog genannt, die eine Dog keine Parameter und liefert akzeptiert. Um den meisten vexing Parse zu vermeiden (und wenn Sie mit C++ 11), können Sie tun:

Dog dog{}; 

und semantisch (zumindest bis C++ 17), Dog dog = Dog(); wird zunächst ein temporäres Objekt erstellen (Dog()), und dann move construct (oder copy construct, wenn Dog Klasse hat keinen Move-Konstruktor) ein benanntes Objekt (dog) von ihm. Obwohl Compiler die Verschiebung optimieren könnten, hat diese Anweisung eine andere Semantik als die übrigen.

Wenn ich mich richtig erinnere, seit C++ 17, P0135r0 wird die Semantik von Dog dog = Dog(); so ändern, dass es die gleiche Bedeutung wie Dog dog; hat.

EDIT: Wie von @LightnessRacesinOrbit in den Kommentaren, Dog dog(); irritierend ist, aber nicht ganz die drängendsten Parsen. Dog dog(Dog()); ist wahr am meisten ärgerlichen Parse. Dog dog(); ist nur eine, na ja, einfache Erklärung, denke ich.

+0

@LightnessRacesinOrbit Hmm, ich könnte mich irren. * Alles, was als Funktionsdeklaration geparst werden kann, ist * - ist das nicht der ärgerlichste Parse? –

+1

Nein, das ist eine einfache Tatsache der Sprache. Es führt zu der am meisten ärgerlichen Analyse ('Hund Hund (Hund())', nach dem Artikel, mit dem du verlinkt hast), aber das ist nicht ganz so. Ich nenne es gerne den "weniger ärgerlichen Parse" als Kompromiss;) –

2
Dog dog(); 

Diese Zeile erstellt kein Objekt, sie wird als Funktionsdeklaration analysiert.

Wenn ich mich richtig erinnere, heißt es am meisten ärgerlichen Parse.

Verwandte Themen