2010-09-28 14 views
19

Este código no se comporta como esperaba.¿Por qué no hay llamadas al constructor?

#include<iostream> 
using namespace std; 

class Class 
{ 
    Class() 
    { 
     cout<<"default constructor called"; 
    } 

    ~Class() 
    { 
     cout<<"destrutor called"; 
    } 
}; 

int main() 
{  
    Class object(); 
} 

Esperaba la salida 'constructor predeterminado llamado', pero no vi nada como la salida. ¿Cuál es el problema?

+3

Su constructor es privado. –

+2

@dribeas: Este no es realmente el análisis más irritante; es solo un análisis un poco irritante. El "análisis más irritante" generalmente se reserva para un intento de crear una variable con un inicializador directo de un valor temporal inicializado: 'A a (A());' (Mi error originalmente) –

+0

vea también http://stackoverflow.com/questions/180172/default-constructor-with-empty-brackets –

Respuesta

17

Ninguna llamada a constructor

porque el constructor nunca se llama en realidad.

Class object(); se interpreta como la declaración de una función object teniendo ningún argumento y devolver un objeto de Class [por valor]

Trate Class object;

EDITAR:

Como Mike se dio cuenta de esto es no es exactamente el mismo código que el que está alimentando al compilador. ¿Es el constructor/destructor public o es Class una estructura?

Sin embargo, Google para C++ es un análisis más irritante.

+0

Tengo la respuesta un momento antes que yo _y_ reformateé la publicación. +1 – JoshD

+0

Gracias @JoshD :) –

31

No. Su línea Class object(); declaró una función. Lo que desea escribir es Class object;

Pruébelo.

Puede que también le interese el análisis más irritante (como han notado otros). Un gran ejemplo está en Effective STL, Elemento 6 en la página 33. (En la 12ª impresión, septiembre de 2009.) Específicamente, el ejemplo en la parte superior de la página 35 es lo que hizo, y explica por qué el analizador lo maneja como una declaración de función.

+1

+1, btw Problemas de Visual C++ 'advertencia C4930: función de prototipo no llamada (¿era una definición de variable prevista?)' En tales casos. – sharptooth

+1

¿Es eso realmente el "análisis más irritante"? Siempre pensé que la frase se refería al problema más frustrante, que 'T x (T())' es una declaración de función. –

+0

@James McNellis: Eso es lo que Scott Meyers llamó. No estoy exactamente de acuerdo, y ni siquiera conecté esta pregunta con ella de inmediato. Creo que tu ejemplo es mucho más común y frustrante. – JoshD

0

Se puede utilizar la siguiente manera:

Class obj; 
//or 
Class *obj = new Class(/*constructor arguments*/); 
Cuestiones relacionadas