Effective C++勉強メモ: Item 12 Copyメンバ関数を自分で書く場合は気をつける
オブジェクトのコピー関連のメンバ関数は(C++11より前の場合)Copy ConstructorとCopy Assignmentの二つ。(C++11以降はMove関連のものも・・・)
これらはコンストラクタとデストラクタと合わせて、コンパイラがデフォルトで書いてくれる、という話は以前の項目でも出ていた。
そのデフォルトを使わず、自分でコピー関連を書く場合、
- 自身のローカルメンバデータはすべて明示的にコピー
- すべてのベースクラスのcopy constructor/assignmentを明示的に呼び出す
の二点を忘れると、データの一部がデフォルトコンストラクタで初期化されたままになり、正しいコピーにはならない。
このミスはコンパイラエラーにもならないので、うっかりするとランタイムで変なバグが出る原因になる。特にベースクラスのコピーは忘れやすい。
また、copy constructorとcopy assignmentは似た処理を書くことが多いが、どちらかをもう片方から呼び出そうとすると「すでに存在しているオブジェクトがターゲットか、新しく初期化するオブジェクトか」という根本的な違いにぶち当たり、うまくいかない。共通の処理をprivateなinit
関数に定義して、それをどちらからも呼び出すようにしよう。