0

クラスにポインターを使用して宣言されたデータ メンバーがない場合、コピー コンストラクターには常に代入演算子と同じコードが含まれますか? もしそうでなければ、なぜですか?

編集私が何を意味するかを説明するためにいくつかのコードが必要だと思います:

class A{
public:
    A();
    A(const A& a);
    A& operator=(const A& a);

private:
    int a;
    double b;
};

//Copy constructor
A::A(const A& src){
    a = src.a;
    b = src.b;
}

//Assignment operator
A& A::operator=(const A& src){
    //Because none of the data members are pointers- the code in here 
    //would be the same as the copy constructor?

    //Could I do:
    a = src.a;
    b = src.b;
    //?
}
4

2 に答える 2

3

いいえ、メンバーの代入演算子が関係しています:

#include <iostream>
#include <stdexcept>

struct X {
    X() { std::cout << "construct" << std::endl; }
    X(const X&) { std::cout << "copy construct" << std::endl;  }
    X& operator = (const X&) {
        throw std::logic_error("assignment");
    }
};

struct Y {
    X x;
};

int main() {
    Y y0;
    Y y1(y0);
    y1 = y0;
    return 0;
}
于 2013-09-29T12:37:42.310 に答える
1

コピー コンストラクターは生メモリ上で動作します。そのため、まだ設定されていないメンバー変数を参照する場合は、初期化されていないメモリを参照しています。

代入演算子は、構築されたオブジェクトが既に含まれているメモリを操作します。したがって、すべてのメンバー変数は、代入演算子が開始される前に初期化されます。

代入演算子がメンバー変数を調べない場合、コピー ctor コードは同じになります。ただし、代入演算子でメンバー変数代入演算子を使用すると、知らないデータが参照される可能性があることに注意してください。

于 2013-09-29T12:36:32.753 に答える