2010-03-06 29 views
13

Sé que no hay ningún tipo de devolución de los constructores en C++tipo de devolución del constructor en C++

Sin embargo, el siguiente código compila a la derecha. ¿Qué devuelve el constructor en el siguiente código?

class A{ 

public: 
A() {} 
} 


A a = A();  //what is returned by A() here, why? 

¿Hay algún conflicto aquí?

+1

'a' se está construyendo mediante el constructor de copias. Se está haciendo una copia del objeto temporal 'A()'. – GManNickG

Respuesta

16

No se devuelve nada del constructor. La sintaxis A() no es una llamada de constructor, sino que crea un objeto temporal de tipo A (y llama al constructor en el proceso).

No se puede llamar a un constructor directamente, los constructores se llaman como parte de la construcción del objeto.

En su código, durante la construcción del temporal se llama al constructor predeterminado (el que usted definió). Luego, durante la construcción de a, el constructor de copia (generado automáticamente por el compilador) se llama con el temporal como argumento.

Como señala correctamente Greg, en algunas circunstancias (incluida esta), el compilador puede evitar la construcción de copias y la construcción predeterminada a (sin embargo, se debe poder acceder al constructor de copias). No conozco ningún compilador que no realice dicha optimización.

+0

* No puede llamar a un constructor directamente * - seguro que puede: 'A a()'. Además, su compilador probablemente convierta 'A a = A()' en 'A a()' para evitar una copia de objeto redundante. –

+9

'A a()' es una declaración de una función. – avakar

+3

Además, incluso si 'A' tenía otro constructor, digamos' A (int) ', el código' A a (1) 'no sería una llamada directa de un constructor más que' new (& a) A (1) 'es. – avakar

4

La sintaxis T(), donde T es un tipo, es una notación de lanzamiento funcional que crea un objeto de valor inicializado de tipo T. Esto no implica necesariamente un constructor (podría o no). Por ejemplo, el int() es una expresión perfectamente válida y el tipo int no tiene constructores. En cualquier caso, incluso si el tipo T tiene un constructor, interpretar T() como "algo devuelto por el constructor" es simplemente incorrecto. Esta no es una llamada de constructor.

Cuestiones relacionadas