144

C++ の代入コンストラクターとコピー コンストラクターの違いがわかりません。次のようになります。

class A {
public:
    A() {
        cout << "A::A()" << endl;
    }
};

// The copy constructor
A a = b;

// The assignment constructor
A c;
c = a;

// Is it right?

割り当てコンストラクターとコピーコンストラクターのメモリを割り当てる方法を知りたいですか?

4

8 に答える 8

207

コピー コンストラクターは、以前に初期化されていないオブジェクトを他のオブジェクトのデータから初期化するために使用されます。

A(const A& rhs) : data_(rhs.data_) {}

例えば:

A aa;
A a = aa;  //copy constructor

代入演算子は、以前に初期化されたオブジェクトのデータを他のオブジェクトのデータに置き換えるために使用されます。

A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}

例えば:

A aa;
A a;
a = aa;  // assignment operator

コピーの構築をデフォルトの構築と代入で置き換えることもできますが、それは効率が悪くなります。

(ちなみに、上記の私の実装はコンパイラが無料で提供するものとまったく同じなので、手動で実装するのはあまり意味がありません。これら 2 つのうちの 1 つを持っている場合は、何らかのリソースを手動で管理している可能性があります。その場合、The Rule of Threeに従って、もう一方とデストラクタも必要になる可能性が非常に高くなります。)

于 2012-07-29T02:07:07.550 に答える
48

コピー コンストラクターと代入演算子の違いは、新しいプログラマーにとって多くの混乱を引き起こしますが、実際にはそれほど難しいことではありません。要約:

  • コピーを行う前に新しいオブジェクトを作成する必要がある場合は、コピー コンストラクターが使用されます。
  • コピーを行う前に新しいオブジェクトを作成する必要がない場合は、代入演算子が使用されます。

代入演算子の例:

Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator

コピー コンストラクターの例:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor
于 2013-07-23T12:13:09.640 に答える
21

1 つ目はコピーの初期化で、2 つ目は単なる代入です。代入コンストラクタのようなものはありません。

A aa=bb;

コンパイラによって生成されたコピー コンストラクターを使用します。

A cc;
cc=aa;

デフォルトのコンストラクターを使用して を構築し、次に既存のオブジェクトに対してcc*代入演算子** ( ) を使用します。operator =

割り当てコンストラクターとコピーコンストラクターのメモリを割り当てる方法を知りたいですか?

この場合、メモリを割り当てるとは何を意味するのかIDKですが、何が起こるかを見たい場合は、次のことができます。

class A
{
public :
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

また、以下もご覧になることをお勧めします。

変換コンストラクターの代わりにコピーコンストラクターが呼び出されるのはなぜですか?

3つのルールとは?

于 2012-07-29T02:00:00.627 に答える
4

@Luchian Grigore Said はこのように実装されています

class A
{
public :
    int a;
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

void main()
{
    A sampleObj; //Calls default constructor
    sampleObj.a = 10;

    A copyConsObj  = sampleObj; //Initializing calls copy constructor

    A assignOpObj; //Calls default constrcutor
    assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}

出力


デフォルトのコンストラクタ


コピーコンストラクター


デフォルトのコンストラクタ


代入演算子


于 2014-03-03T07:04:09.743 に答える
2

このトピックについて、もう 1 点追加したいと思います。「代入演算子の演算子関数は、クラスのメンバー関数としてのみ記述してください。」他の二項演算子や単項演算子のようにフレンド関数にすることはできません。

于 2017-08-18T18:09:17.657 に答える