2011-09-10 4 views
5

J'ai entendu dire que l'avantage d'utiliser les listes d'initialisation dans le constructeur serait qu'il n'y aurait pas de copies supplémentaires des objets de type classe. Mais qu'est-ce que cela signifie pour le code suivant dans le constructeur de la classe T? Si je commente l'affectation et utilise les listes d'initialisation, quelle serait la différence?Listes d'initialisation dans le constructeur

#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

Je ne sais pas si pertinente à votre question, mais vous voudrez probablement T (X const & obj). –

+0

@ K-ballo: Oui j'ai oublié ça, merci. – user767451

Répondre

6

C'est exactement ce que vous avez déjà dit. Si vous n'utilisez pas la liste d'initialisation, le constructeur par défaut sera appelé en premier, puis l'opérateur d'affectation sera appelé.

Dans votre exemple, ceci est relativement bénin (le compilateur peut même optimiser cela, je pense). Mais dans d'autres cas, il n'est tout simplement pas possible d'éviter la liste d'initialisation. Imaginez si X n'avait pas d'opérateur d'affectation publique.

+0

Ah, il me manquait la fonction d'opérateur d'assignation surchargée pour remarquer cet effet dans mon code. Je l'ai confondu avec le constructeur de copie! – user767451

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

copiera construire x de obj, tandis que

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

construira un défaut x, pour ensuite le remplacer par les valeurs de obj.

Si vous avez l'intention de construire un objet membre, vous devriez le faire dans la liste d'initialisation.

5

Si vous utilisez Affectation, puis:
x sera construit par défaut premier &
puis affecté à obj.

Le coût est, par défaut Construction + Affectation


Si vous utilisez Liste des membres initialiseur alors:
x sera construit et initialisés avec obj.

Le coût est, Construction seulement