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;

}
4

3 に答える 3

6

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

あなたの例では、これは比較的良性です(コンパイラはこれを最適化することさえあると思います)。しかし、それ以外の場合は、イニシャライザ リストを回避することは不可能です。Xパブリック代入演算子がなかったら想像してみてください。

于 2011-09-10T20:47:59.040 に答える
5

Assignmentを使用する場合:
xデフォルトで最初に構築
され、次に で割り当てられobjます。

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


メンバー初期化子リストを使用する場合:
xが構築され、 で初期化されobjます。

費用は、工事のみ

于 2011-09-10T20:48:28.990 に答える
2
T(X &obj) : x(obj) {}

obj からコンストラクト x をコピーしますが、

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

デフォルトの x を作成し、それを obj からの値に置き換えるだけです。

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

于 2011-09-10T20:47:39.770 に答える