2012-02-28 20 views
5

Duplicar posible:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?Crear una instancia de clase con o sin paréntesis?

#include <iostream> 
using namespace std; 

class CTest 
{ 
    int x; 

    public: 
    CTest() 
    { 
     x = 3; 
     cout << "A"; 
    } 
}; 

int main() { 
    CTest t1; 
    CTest t2(); 

    return 0; 
} 

CTest t1 impresiones "A", por supuesto.

Pero parece que no pasa nada en t2(), pero el código funciona bien.

Entonces, ¿usamos esos paréntesis sin argumento? ¿O por qué podemos usarlo de esta manera?

+0

Es [el análisis más irritante] (http://en.wikipedia.org/wiki/Most_vexing_parse) en C++ –

+0

@PeterWood: Personalmente, lo discuto. Históricamente, el "análisis más irritante" se refería solo a los casos en que la ambigüedad se produce con un inicializador que es un valor inicializado temporal, p. 'CTest t2 (CTest());' en lugar de este caso más simple. –

+0

@CharlesBailey 'relacionado con el análisis más irritante' hubiera sido una mejor manera de expresarlo. Gracias. –

Respuesta

14

Esto es una peculiaridad de la sintaxis de C++. La línea

CTest t1; 

declara una variable local del tipo llamado CTestt1. Llama implícitamente al constructor predeterminado. Por otro lado, la línea

CTest t2(); 

Es no una declaración de variable, pero un prototipo local de una función llamada t2 que no tiene argumentos y devuelve un CTest. La razón por la que el constructor no se llama para t2 es porque aquí no se crea ningún objeto.

Si desea declarar una variable local de tipo de objeto y usar el constructor predeterminado, debe omitir los paréntesis.

En C++ 11, se puede decir, alternativamente

CTest t2{}; 

cual llega a solicitar el constructor por defecto.

Espero que esto ayude!

+8

Debe tener en cuenta la diferencia entre 'CTest t1; CTest t2 = CTest(); ' –

Cuestiones relacionadas