2010-02-22 11 views
9

Quiero construir un objeto en la pila, usando C++. ¿Usted sabe cuál es la diferencia entre estos a los modos de llamada al constructor (con y sin paréntesis):Diferentes formas de construir un objeto en C++

a) MyClass object ;

b) MyClass object() ;

estoy utilizando MFC y en la construcción la variable global para la aplicación principal, si uso de la última manera, obtengo una excepción, pensé que estas dos formas eran equivalentes.

Gracias a todos por cualquier información.

+0

cómo el constructor de MiClase parece? –

+0

No creo que obtendría una excepción con (b). Esto debería generar un error de compilación. – LeopardSkinPillBoxHat

Respuesta

18

Este es uno de esos errores de C++.

MyClass object(); 

es la forma en que una función prototipo se define en C++, por lo que el compilador piensa que está intentando declarar otra función en el medio de otra función.

Si desea invocar el constructor por defecto (es decir, el que no tiene argumentos), utilice esta sintaxis en su lugar:

MyClass object; 

Véase también la respuesta de Garth Gilmour a la pregunta ahora borrado-What is your (least) favorite syntax gotcha?:

En C++

Employee e1("Dave","IT"); //OK 
Employee e2("Jane"); //OK 
Employee e3(); //ERROR - function prototype 
+2

El inicializador '()' en C++ no es necesariamente una invocación del constructor predeterminado. El inicializador '()' realiza una inicialización de valor que no es equivalente a la invocación de constructor predeterminada, es decir, la última forma (sin '()') no es equivalente a la intención expresada en la primera. La forma correcta de trabajar con otro problema de "prototipo" es utilizar la sintaxis de inicialización de copia 'MyClass object = MyClass()' y esperar que el compilador lo traduzca en un código eficiente. – AnT

+0

@David: tienes razón y estoy borrando mi comentario –

8

Por ejemplo:

class MyClass 
{ 
    public: 
    MyClass() 
    {x = 0;} 
    MyClass(int X) 
    {x = X;} 
    private: 
    int x; 
}; 

int main() 
{ 
    MyClass myObject(56); // initialize x to value '56' 
    MyClass myObject2; //calls default constructor and initializes x to 0 
    return 0; 
} 
Cuestiones relacionadas