2011-09-10 103 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初始化。

成本,建設只有

相關問題