コピーコンストラクタはコンストラクタで、オブジェクトを作成します。具体的には、コピーコンストラクタは、他に意味的に同じであるオブジェクトを作成し、それは「コピー」を作るれた既存のオブジェクト:
Person newperson(oldperson); // newperson is a "copy" of oldperson
割り当てオペレータは全くコンストラクタはないが、既存のオブジェクトに対してのみ呼び出すことができる通常のメンバ関数です。その目的は、別のオブジェクトのセマンティクスをオブジェクトに割り当てることで、割り当て後に2つが意味的に同じになるようにします。通常、代入演算子を「オーバーロード」しているわけではなく、定義しているだけです。
Person p; // construct new person
/* dum-dee-doo */
p = otherperson; // assign to p the meaning of otherperson, overwriting everything it was before
// invokes p.operator=(otherperson)
それは(==
で)オブジェクトと比較することは理にかなっている場合、そのコピーの構築と割り当ての両方が、我々はその後平等を持っているように振る舞うべきだと注意:
Person p1(p2);
assert(p1 == p2);
p1 = p3;
assert(p1 == p3);
あなたが保証を余儀なくされていませんこれは、あなたのクラスのユーザーは通常、この動作を想定しています。実際には、コンパイラはPerson p1; Person p2(p1);
がp1 == p2;
を必要とすると仮定します。
最後に、脇や他の場所で言ったように、Person p = p2;
は文字通りがPerson p(p2)
(コピー建設)を意味することに注意して、最終的な、そして決してPerson p; p = p2;
として。これは構文上の砂糖で、効率を損なうことなく自然に見えるコードを書くことができます(あるいは、あなたのクラスがデフォルトで構成可能でないことさえあるかもしれません)。
+1しかし、混乱を避けるために、あなたの答えにはコピーコンストラクタの別の例として 'Person p3 = p1'も含まれているはずです。 –
したがって、コピーコンストラクタは明示的な方法でのみ使用されますか? '='を使わないでください? @OliCharlesworth正確には –
です。私はそれについて疑問に思っている... –