2011-09-10 19 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用のconst&OBJ)したいと思います。 –

+0

@ K-ballo:はい、忘れてしまった、ありがとう。 – user767451

答えて

6

これはまさにあなたが言ったことです。初期化子リストを使用しない場合、デフォルトのコンストラクタが最初に呼び出され、代入演算子が呼び出されます。

あなたの例では、これは比較的無害です(コンパイラはこれを最適化するかもしれません、と思います)。しかし、それ以外の場合は、単にイニシャライザーリストを避けることはできません。 Xにパブリック代入演算子がないとします。

+0

ああ、オーバーロードされた代入演算子関数がコード内でその影響を受けていなかった。私はコピーコンストラクタと混同しました! – user767451

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

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

がobjの値に置き換えるだけで、その後に、デフォルトのXを構築する一方、OBJからのxを構築コピーします

メンバオブジェクトを作成する場合は、初期化リストでそれを行う必要があります。

5

あなたが割り当て、使用している場合:
xをデフォルトになりますが、その後objに割り当てられた最初の&
を構築しました。あなたはその後、メンバー初期化子リストを使用する場合は

コストは、デフォルトの建設+割り当て


です:
xobjで構成され、初期化されます。

コストは、建設あなたの質問に該当する場合のみ

関連する問題