0

以下の例では、なぜother.age0ではなく88を出力するのですか?

#include <atlstr.h>//CString for non-MFC
class A
{
public:
    A() : name("Nobody"), age(0) {}
    ~A(){};


    A( CString name, unsigned age ) : name( name ), age( age ) {}
    A& operator=( const A& ref )
    {
        name = ref.name;
        age = 0;
    }

    CString name;
    unsigned int age;
};

int _tmain( int argc, _TCHAR* argv[] )
{

    A person( CString("Michael"), 88 );
    A other = person;

    std::cout << other.name << std::endl << other.age;
} 
4

2 に答える 2

3
A other = person;

を呼び出しますcopy c-tor。これは、ではなくコンパイラによって暗黙的に定義されoperator =ます。

12.8 / 4

クラス定義でコピーコンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。したがって、クラス定義の場合

struct X {
X(const X&, int);
};

コピーコンストラクターは暗黙的に宣言されます。

12.8 / 8

クラスXの暗黙的に定義されたコピーコンストラクターは、そのサブオブジェクトのメンバーごとのコピーを実行します。コピーの順序は、ユーザー定義のコンストラクターのベースとメンバーの初期化の順序と同じです(12.6.2を参照)。各サブオブジェクトは、そのタイプに適した方法でコピーされます。

—サブオブジェクトがクラスタイプの場合、クラスのコピーコンストラクターが使用されます。

—サブオブジェクトが配列の場合、各要素は要素タイプに適した方法でコピーされます。

—サブオブジェクトがスカラー型の場合、組み込みの代入演算子が使用されます。

引用はC++03標準からのものです。

于 2012-08-28T01:53:41.880 に答える
2

代入演算子を使用していないため、コピー構築を使用しています。

A other = person;

†と同等です:

A other(A(person));

また、コピーコンストラクターを明示的に指定していないため、デフォルトのコンストラクターが使用されます。これはメンバーごとのコピーであり、の値として88が残りますage。これはあなたのオペレーターを使用します:

A other;
other = person;

†はい、それはコピーのコピーです。コンパイラは、最適化をオンにすると、これを次のように変換することに注意してください。

A other(person);

コピーエリソンを介して。一般的に、これは:

T x = y;

これと同等です:

T x(T(y));

これは(最適化後)これになります:

T x(y);

Tコピー可能または移動可能である限り。

于 2012-08-28T01:54:24.310 に答える