C++コーディングの小ネタ
C++のコードを書く際のちょっとした小ネタを紹介します。
今回はコンパイラが自動生成する関数についてです。
デフォルトコンストラクタ、コピーコンストラクタ、コピー代入演算子、デストラクタをプログラマが宣言していない場合、コンパイラがこれらを自動生成します。
自動生成して欲しくない場合にprivateに宣言を書いておくのは定番のテクニックですが、このときに実装を書いてはいけません。
以下はデフォルトコンストラクタの自動生成を抑制する場合のコードです。
■誤ったコード
1 2 3 4 5 6 7 8 |
class Hoge { public: ・・・ private: ・・・ Hoge() {} /// 実装を書いてしまっている } |
■正しいコード
1 2 3 4 5 6 7 8 |
class Hoge { public: ・・・ private: ・・・ Hoge(); /// 宣言のみ } |
デフォルトコンストラクタの自動生成を抑制するのはクラスのインスタンス化を禁止したい場合ですが、実装を書いてしまうと同じクラス内からのコンストラクタ呼び出しが可能であるため、バグの原因になってしまいます。
宣言のみとしておけば、
例え同じクラス内からのコンストラクタ呼び出しがあったとしてもコンパイルエラーとなるためミスに気付くことができます。