No, un constructor de object
es muy diferente de una función llamada object
y que regresa object
. Un constructor no tiene nombre, pero eso es en gran medida un tecnicismo. Las diferencias más importantes son que un constructor no tiene tipo de retorno y que no se puede llamar directamente.
Un constructor no devuelve nada porque se le asigna un bloque de memoria y opera en esa memoria en el lugar. Podría ayudar si olvida el nombre "constructor" por un momento y piensa en él como un inicializador . El propósito del constructor no es construir un objeto "de la nada". Su propósito es inicializar un objeto en el lugar preciso de la memoria donde debe estar.
Si un constructor devolviera un objeto, ese objeto devuelto (el valor de retorno) tendría que vivir en algún lugar (probablemente en la pila), y allí, tendría que inicializarse de alguna manera , estamos corriendo en un bucle aquí.
Esto va de la mano con el hecho de que un constructor nunca puede ser llamado directamente. Si tiene una clase object
y usa una expresión en object()
alguna parte, no tiene la semántica de "llamar al constructor de object
". Tiene la semántica de "crear un objeto de tipo temporal object
". El compilador traduce esto en la asignación de un lugar para que el temporal viva (probablemente / comúnmente en la pila), y llama al constructor para construir (= inicializar) un objeto en ese lugar.
El mismo principio se aplica cuando se usa new object()
. Esta es una nueva expresión, que hace dos cosas:
- Llame a una función de asignación
operator new
(que devuelve a void*
) para asignar memoria sin procesar para el objeto.
- Emita una llamada de constructor en esta memoria sin formato para construir (= inicializar) un objeto en ese fragmento de memoria sin formato.
Pensando en un constructor de object
como una función como esta:
static object object();
Está Mal. En todo caso, la forma en que funciona un constructor está más cerca de esto:
static void object(object &place_to_work_in);
Con la excepción de que nunca puedes llamarlo directamente. Está siempre sólo se llama cuando especificado por una construcción del lenguaje diferente. Incluso la colocación nueva (también conocida como el truco "llamar a un constructor aquí") new (&place_for_object) object()
no llama al constructor directamente. Se traduce en una llamada a la forma de colocación nueva, operator new
que devuelve su argumento, seguido de una llamada al constructor (como cualquier otra expresión nueva).