2010-02-18 21 views
5

cosas curiosos con g ++ (tal vez también con otros compiladores?):C++ asignación en la pila actuando curiosamente

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 con g ++:

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

El primer tipo de asignación no construye el objeto. ¿Qué me estoy perdiendo?

Respuesta

12

El primer tipo de construcción no está realmente construyendo el objeto. Con el fin de crear un objeto en la pila utilizando el constructor por defecto, debe omitir el () 's

Object myObjectOnTheStack; 

Su estilo actual de la definición en lugar declara una función llamada myObjectOnTheStack que devuelve un Object.

+0

Pruebe 'myObjectOnTheStack objeto;' 'es decir, sin el()' – Justicle

+0

@Jerry, agradecimiento que corrigen la terminología – JaredPar

+4

... "en lugar * * declara una función" ... – Potatoswatter

4

Otro ejemplo más del "análisis más irritante". En lugar de definir un objeto, ha declarado una función llamada myObjectOnTheStack que no toma argumentos y devuelve Object.

2
Object myObjectOnTheStack(); 

es una declaración adelantada de una función myObjectOnTheStack teniendo ningún parámetro y devolver un Object.

Lo que queremos es

Object myObjectOnTheStack; 
Cuestiones relacionadas