2011-03-10 14 views
7

He estado buscando un tiempo para una buena explicación de por qué/por qué no el siguiente uso del constructor struct como un argumento de la función es legal. ¿Alguien puede proporcionar uno?¿Usar un constructor en una llamada a función?

// Begin simple illustrative example C++ program  
#include<vector.h> 

struct Item 
{ 
    Item(double data, const int lead) 
    : m_grid(data), m_lead(lead) {} 

    double m_grid; 
    int m_lead; 
}; 

int main() 
{ 
    double img = 0.0; 
    int steps = 5; 
    std::vector<Item> images; 
    for (int i = 0; i < steps; i++) 
    { 
    img += 2.0; 
    images.push_back(Item(img,i)); 
    } 
    return 0; 
} 

Yo tenía la impresión de un constructor no tiene ni un tipo de retorno ni declaración ...

+1

¿Es C++? Por favor especifique su idioma –

+0

Lo sentimos, sí, C++ – Evan

Respuesta

4

es legal.

Nunca se llama al constructor a sí mismo; en realidad estás declarando un objeto sin nombre o "temporal" del tipo Item. Ver cómo evoluciona la sintaxis cuando se hace el objeto no identificado:

Item a(img,i); // normal 
Item(img,i); // temporary 

Aunque parece como si estuviera llamando al constructor como una función, que no eres.

De todos modos, se puede utilizar el temporal como un "valor p" (debido a que es uno) en los argumentos de funciones y similares, que es lo que estás haciendo aquí.


Por cierto, no use los viejos iostream.h y vector.h cabeceras. Son anteriores a 1998. En ISO Standard C++, debe usar iostream y vector, respectivamente. Los encabezados estándar en C++ no terminan en ".h" (inb4, ignorando los encabezados C heredados por compatibilidad con versiones anteriores).

4

Esto es legal, porque push_back toma es argumento de referencia constante, y luego crea una copia del objeto. La llamada del constructor crea un objeto temporal, que es un valor r. Una referencia constante puede vincular un valor r. El método no puede modificar el objeto que se pasa, pero puede crear una copia.

+0

No, el programador nunca llama al constructor. Sé lo que dices, pero creo que tus palabras son engañosas. –

3

Aunque parece una llamada a función, la expresión Artículo (img, i) es en realidad la creación de un objeto temporal. La diferencia es que en el tiempo de ejecución, la memoria se asignará para el objeto en la pila, y luego se llamará al constructor, mientras que si se tratara de una llamada a función normal, no se asignaría memoria.

+0

Además de todas las demás cosas involucradas en la construcción de un objeto. –

8

No es el constructor o su valor de retorno que se pasa a push_back. C++ en realidad usa el constructor para crear un objeto temporal sin nombre, que existe solo por la duración de la llamada a la función; típicamente, en la pila. Esto se pasa luego al push_back, y push_back copia su contenido en su vector.

+5

+1. "duración de la expresión" podría ser mejor, sin embargo. –

Cuestiones relacionadas