コピー コンストラクターは、伝統的に C++ プログラムではどこにでもありました。ただし、C++11以降、これに正当な理由があるかどうかは疑問です。
プログラム ロジックがオブジェクトのコピーを必要としない場合でも、オブジェクトの再割り当てのみを目的としてコピー コンストラクター(通常はデフォルト)が含まれることがよくありました。コピー コンストラクターがないと、オブジェクトを に格納したり、関数からオブジェクトを返すことさえできませんでした。std::vector
ただし、C++11 以降では、ムーブ コンストラクターがオブジェクトの再割り当てを担当しています。
コピー コンストラクターのもう 1 つの使用例は、単純にオブジェクトのクローンを作成することでした。.copy()
ただし、コピー コンストラクターよりもor.clone()
メソッドの方がその役割に適していると確信しています。
オブジェクトのコピーはあまり一般的ではありません。確かに、オブジェクトのインターフェースに「自分自身の複製を作成する」メソッドを含める必要がある場合もありますが、それは場合によってのみです。その場合、明示的は暗黙的よりも優れています。
場合によっては、オブジェクトがいくつかの異なる の
.copy()
ようなメソッドを公開することがあります。異なるコンテキストでは、コピーを異なる方法で作成する必要がある場合があるためです (たとえば、より浅いまたはより深い)。コンテキストによっては、プログラム ロジックに関連する重要な処理をメソッドに実行させたい場合があり
.copy()
ます (カウンターをインクリメントするか、コピーの新しい一意の名前を生成するなど)。コピー コンストラクターに明白でないロジックを含むコードは受け入れません。最後になりましたが、必要に応じてメソッドを仮想にすることができ、スライス
.copy()
の問題を解決できます。
実際にコピー コンストラクターを使用したい唯一のケースは次のとおりです。
- コピー可能なリソースの RAII ハンドル (明らかに)
- 数学ベクトルや行列など、組み込み型のように使用することを意図した構造体 - 単純に
頻繁にコピーされ、vec3 b = a.copy()
冗長すぎるため。
補足: CAS にはコピー コンストラクターが必要であるという事実を考慮しましたが、まったく同じ理由に基づいて冗長であると考えるCASが必要です。本当にこれが必要な場合は、+を使用することをお勧めします。)
operator=(const T&)
.copy()
operator=(T&&) = default
T(const T&) = delete
私にとって、それはデフォルトでどこでも使用し.copy()
、必要に応じてメソッドを提供するのに十分なインセンティブです。(おそらく定型文なしprivate T(const T&) = default
で書けるようになるためだけcopy()
のものでもあります。)virtual copy()
Q: 上記の推論は正しいですか、それとも、ロジック オブジェクトが実際にコピー コンストラクターを必要とするか、何らかの形でコピー コンストラクターから利益を得る理由を見逃しているのでしょうか?
具体的には、移動コンストラクターが C++11 でオブジェクトの再割り当ての責任を完全に引き継いだという点で正しいですか? オブジェクトの状態を変更せずに、オブジェクトをメモリ内の別の場所に移動する必要があるすべての状況で、非公式に「再割り当て」を使用しています。