2011-03-10 14 views
7

Sono stato alla ricerca di una buona spiegazione del perché/perché il seguente utilizzo del costruttore struct come argomento di funzione è legale. Qualcuno può fornirne uno?Utilizzo di un costruttore in una chiamata di funzione?

// 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; 
} 

ho avuto l'impressione di un costruttore non ha né un tipo di ritorno né dichiarazione ...

+1

È C++? Si prega di specificare la vostra lingua. –

+0

Siamo spiacenti, si, C++ – Evan

risposta

4

È legale.

Non si chiama mai il costruttore; in realtà stai solo dichiarando un oggetto senza nome o "temporaneo" di tipo Item. Guarda come la sintassi si evolve quando si effettua l'oggetto senza nome:

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

Anche se sembra come se si sta chiamando il costruttore come una funzione, non lo sei.

In ogni caso, è possibile utilizzare il temporaneo come un "rvalue" (perché è uno) in argomenti di funzione e simili, che è ciò che si sta facendo qui.


BTW, non utilizzare le vecchie iostream.h e vector.h intestazioni. Sono anteriori al 1998. Nello standard ISO C++, dovresti usare rispettivamente iostream e vector. Le intestazioni standard in C++ non terminano in ".h" (inb4, ignorando le intestazioni C ereditate per compatibilità con le versioni precedenti).

4

Questo è legale, perché push_back prende il ragionamento per riferimento const, e quindi crea una copia dell'oggetto. La chiamata del costruttore crea un oggetto temporaneo, che è un valore rvalore. Un riferimento const può associare un valore. Il metodo non può modificare l'oggetto che è passato, ma può creare una copia.

+0

No, il programmatore non chiama mai il costruttore. So cosa stai dicendo, ma penso che le tue parole siano fuorvianti. –

3

Sebbene assomigli ad una chiamata di funzione, l'espressione Item (img, i) è in realtà la creazione di un oggetto temporaneo. La differenza è che in fase di esecuzione, la memoria verrà allocata per l'oggetto nello stack e quindi verrà chiamato il costruttore, mentre se questa fosse una normale chiamata di funzione non verrà allocata alcuna memoria.

+0

Inoltre tutte le altre cose coinvolte nella costruzione di un oggetto. –

8

Non è il costruttore o il suo valore restituito passato a push_back. C++ utilizza effettivamente il costruttore per creare un oggetto temporaneo senza nome, che esiste solo per la durata della chiamata alla funzione; tipicamente, in pila. Questo viene quindi passato a push_back e push_back copia il suo contenuto nel vettore.

+5

+1. "durata dell'espressione" potrebbe essere migliore, però. –

Problemi correlati