2010-02-18 8 views
5

Neugierig Dinge mit g ++ handeln (vielleicht auch mit anderen Compilern?):C++ Zuordnung auf dem Stapel neugierig

struct Object { 
     Object() { std::cout << "hey "; } 
     ~Object() { std::cout << "hoy!" << std::endl; } 
}; 

int main(int argc, char* argv[]) 
{ 
     { 
       Object myObjectOnTheStack(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object* object = new Object(); 
       delete object; 
     } 
} 

Compied mit g ++:

=========== 
hey hoy! 
=========== 
hey hoy! 

Die erste Art der Zuteilung konstruiert nicht das Objekt. Was vermisse ich?

Antwort

12

Der erste Typ von Konstruktion baut das Objekt nicht tatsächlich. Um ein Objekt auf dem Stapel mit dem Standard-Konstruktor zu erstellen, müssen Sie die () ‚s

Object myObjectOnTheStack; 

Ihre aktuellen Stil der Definition auslassen stattdessen eine Funktion namens myObjectOnTheStack erklärt, die ein Object zurückgibt.

+0

Versuchen 'Objekt myObjectOnTheStack;' dh ohne die '()' – Justicle

+0

@Jerry dank korrigierte ich die Terminologie – JaredPar

+4

... "statt * erklärt * eine Funktion" ... – Potatoswatter

4

Noch ein weiteres Beispiel für die "am meisten ärgerlichen Parse". Anstatt ein Objekt zu definieren, haben Sie eine Funktion mit dem Namen myObjectOnTheStack deklariert, die keine Argumente akzeptiert und eine Object zurückgibt.

2
Object myObjectOnTheStack(); 

ist eine Vorwärts-Deklaration einer Funktion myObjectOnTheStack keine Parameter zu nehmen und eine Object zurückkehrt.

Was Sie wollen, ist

Object myObjectOnTheStack;