2011-09-10 66 views
5

我听说在构造函数中使用初始化列表的优点是不会有额外的类类型对象副本。但是,对于T类构造函数中的以下代码,它意味着什么?如果我评论赋值并使用初始化列表,那么区别是什么?构造函数中的初始化列表

#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

不知道有关你的问题,但你可能会想T(X常量和OBJ)。 –

+0

@ K-ballo:是的,我忘记了,谢谢。 – user767451

回答

6

这正是你已经说过的。如果你不使用初始化列表,那么默认构造函数将首先被调用,然后赋值运算符将被调用。

在你的例子中,这是相对良性的(编译器甚至可以优化这个,我认为)。但在其他情况下,避免初始化列表根本无法实现。试想一下,如果X没有公共赋值运算符。

+0

啊,我错过了重载的赋值操作符函数来注意我的代码中的效果。我把它与复制构造函数混淆! – user767451

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

将复制构建从obj获得的X,而

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

将构造一个默认的X,只有然后从obj中的值替换它。

如果你打算构造一个成员对象,你应该在初始化列表中执行它。

5

如果使用分配,则:
x将默认构造第一&
然后用obj分配。

成本,默认建筑+分配


如果使用成员初始化列表,则:
x将建造并与obj初始化。

成本,建设只有

相关问题