Arantium Maestum

プログラミング、囲碁、読書の話題

Effective C++勉強メモ: Item 12 Copyメンバ関数を自分で書く場合は気をつける

オブジェクトのコピー関連のメンバ関数は(C++11より前の場合)Copy ConstructorとCopy Assignmentの二つ。(C++11以降はMove関連のものも・・・)

これらはコンストラクタとデストラクタと合わせて、コンパイラがデフォルトで書いてくれる、という話は以前の項目でも出ていた。

そのデフォルトを使わず、自分でコピー関連を書く場合、

  • 自身のローカルメンバデータはすべて明示的にコピー
  • すべてのベースクラスのcopy constructor/assignmentを明示的に呼び出す

の二点を忘れると、データの一部がデフォルトコンストラクタで初期化されたままになり、正しいコピーにはならない。

このミスはコンパイラエラーにもならないので、うっかりするとランタイムで変なバグが出る原因になる。特にベースクラスのコピーは忘れやすい。

また、copy constructorとcopy assignmentは似た処理を書くことが多いが、どちらかをもう片方から呼び出そうとすると「すでに存在しているオブジェクトがターゲットか、新しく初期化するオブジェクトか」という根本的な違いにぶち当たり、うまくいかない。共通の処理をprivateなinit関数に定義して、それをどちらからも呼び出すようにしよう。