web-dev-qa-db-ja.com

代入演算子とコピーコンストラクターの違いは何ですか?

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?

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

88
alan.chen

copy constructorは、以前は初期化されていなかった他のオブジェクトのデータからのオブジェクト。

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つのいずれかがある場合は、何らかのリソースを手動で管理している可能性があります。その場合、The Three of Ruleごとに、もう1つとデストラクタも必要になるでしょう。

132
sbi

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

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

代入演算子の例:

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
34
Arun

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;}
};

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

変換コンストラクターの代わりにコピーコンストラクターが呼び出される理由

つのルールとは?

18
Luchian Grigore

コピーコンストラクターと割り当てコンストラクターの違いは次のとおりです。

  1. コピーコンストラクタの場合、新しいオブジェクトを作成します。(<classname> <o1>=<o2>
  2. 割り当てコンストラクタの場合、オブジェクトは作成されません。つまり、既に作成されたオブジェクト(<o1>=<o2>)に適用されます。

そして両方の基本的な機能は同じで、メンバーごとにo2からo1にデータをコピーします。

3
Nitesh Kumar

@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
}

出力


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


コピーコンストラクタ


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


代入演算子


3
Mak

このトピックについてもう1つポイントを追加したいと思います。 「代入演算子の演算子関数は、クラスのメンバー関数としてのみ記述する必要があります。」他の二項演算子や単項演算子とは異なり、フレンド関数として作成することはできません。

2
MD BELAL RASHID

簡単に言えば、

コピーコンストラクターは、既存のオブジェクトのコピーとして、既存のオブジェクトから新しいオブジェクトが作成されるときに呼び出されます。また、すでに初期化されたオブジェクトに別の既存のオブジェクトから新しい値が割り当てられると、代入演算子が呼び出されます。

t2 = t1;  // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1;  // calls copy constructor, same as "Test t3(t1);"
2
Dev

コピーコンストラクタについて追加するもの:

  • 値でオブジェクトを渡すとき、コピーコンストラクタを使用します

  • オブジェクトが値によって関数から返されるとき、コピーコンストラクタを使用します

  • 別のオブジェクトの値を使用してオブジェクトを初期化するとき(例として)。

1
Frank Shen