2011-09-10 21 views
5

Ho sentito che il vantaggio di utilizzare gli elenchi di inizializzazione nel costruttore è che non ci saranno copie aggiuntive di oggetti di tipo classe. Ma cosa significa per il seguente codice nel costruttore di classe T? Se commento il compito e utilizzo le liste di inizializzazione quale sarebbe la differenza?Elenchi di inizializzazione nel costruttore

#include <iostream> 
using std::cout; 
using std::endl; 
using std::ostream; 

class X { 

public: 

    X(float f_x = 0, float f_y = 0):x(f_x), y(f_y) {} 


    ~X() {} 

    X(const X& obj):x(obj.x), y(obj.y) {} 

    friend ostream& operator << (ostream &os, X &obj); 

private: 
    float x; 
    float y; 
}; 

ostream& operator << (ostream &os, X &obj) 
{ os << "x = " << obj.x << " y = " << obj.y; return os;} 

class T { 

public: 

    T(X &obj) : x(obj) { /* x = obj */ } 

    ~T() { } 

    friend ostream& operator << (ostream &os, T &obj); 

private: 

    X x; 

}; 

ostream& operator << (ostream &os, T &obj) 
{ os << obj.x; return os; } 

int main() 
{ 
    X temp_x(4.6f, 6.5f); 

    T t(temp_x); 

    cout << t << endl; 

} 
+0

Non è sicuro se del caso alla tua domanda, ma si sarebbe probabilmente desidera T (X const & obj). –

+0

@ K-ballo: Sì, l'ho dimenticato, grazie. – user767451

risposta

6

È esattamente quello che hai già detto. Se non si utilizza l'elenco di inizializzazione, verrà chiamato prima il costruttore predefinito, quindi verrà richiamato l'operatore di assegnazione.

Nel tuo esempio, questo è relativamente benigno (il compilatore potrebbe persino ottimizzare questo, penso). Ma in altri casi, semplicemente non è possibile evitare l'elenco di inizializzazione. Immaginate se X non avesse un operatore di assegnazione pubblico.

+0

Ah, mi mancava la funzione dell'operatore di assegnazione sovraccaricata per notare quell'effetto nel mio codice. L'ho confuso con il costruttore di copie! – user767451

2
T(X &obj) : x(obj) {} 

copierà costruire x da obj, mentre

T(X &obj){ x = obj; } 

costruirà un default x, per poi sostituirla con i valori da obj.

Se si intende costruire un oggetto membro, è necessario farlo nell'elenco di inizializzazione.

5

Se si utilizza Assegnazione, quindi:
x sarà di default ricostruito &
poi assegnato con obj.

Il costo è, predefinito Edilizia + Assegnazione


Se si utilizza Stati lista di inizializzazione poi:
x sarà costruito e inizializzato con obj.

Il costo è, Edilizia solo

Problemi correlati