2011-09-10 26 views
5

He oído que la ventaja de usar listas de inicialización en el constructor sería que no habrá copias adicionales de los objetos de tipo de clase. Pero, ¿qué significa para el siguiente código en el constructor de clase T? Si comento la tarea y uso las listas de inicialización, ¿cuál sería la diferencia?Listas de inicialización en el constructor

#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

No estoy seguro de si es relevante a su pregunta, pero probablemente querrá T (X const y obj). –

+0

@ K-ballo: Sí, lo olvidé, gracias. – user767451

Respuesta

6

Es exactamente lo que dijiste. Si no usa la lista de inicializadores, primero se llamará al constructor predeterminado y luego se llamará al operador de asignación.

En su ejemplo, esto es relativamente benigno (el compilador puede incluso optimizar esto, creo). Pero en otros casos, simplemente no es posible evitar la lista de inicializadores. Imagine si X no tuviera un operador de asignación pública.

+0

Ah, me faltaba la función de operador de asignación sobrecargada para notar ese efecto en mi código. ¡Lo confundí con el constructor de copias! – user767451

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

copiará construir x de obj, mientras

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

construirá un defecto x, sólo para luego reemplazarlo con los valores de obj.

Si intenta construir un objeto miembro, debe hacerlo en la lista de inicialización.

5

Si utiliza Asignación, entonces:
x habrá predeterminado construyó &
entonces asignado con obj.

El costo es, por defecto Construcción + Asignación


Si utiliza Miembro lista de inicialización a continuación:
x se construirá e inicializado con obj.

El costo es, construcción única

Cuestiones relacionadas