ProgrammingC++開発者

C++におけるデフォルトコンストラクタはどのように機能しますか?クラスにコンストラクタを一つも宣言しなかった場合、または他のコンストラクタを明示的に宣言したがデフォルトコンストラクタを宣言しなかった場合、どうなりますか?

Hintsage AIアシスタントで面接を突破

回答

C++における_デフォルトコンストラクタ_とは、パラメータなしのコンストラクタ、またはすべてのパラメータにデフォルト値があるコンストラクタのことです。クラスにコンストラクタが一つも宣言されていない場合、コンパイラは自動的に_public_デフォルトコンストラクタを生成します。しかし、少なくとも一つの他の任意のコンストラクタ(例えば、パラメータ付きコンストラクタ)が宣言された場合、_自動的に提供されるコンパイラの_デフォルトコンストラクタは生成されなくなります。そのようなクラスでデフォルトコンストラクタが必要な場合は、明示的に宣言する必要があります(例:ClassName() = default;)。

コード例

class Foo { public: Foo(int x) {} // ユーザー定義コンストラクタ // Foo()はコンパイラによって自動生成されません! }; Foo f; // コンパイルエラー — デフォルトコンストラクタがありません!

その場合、デフォルトコンストラクタを明示的に作成するには、次を追加します:

class Foo { public: Foo() = default; Foo(int x) {} };

ひっかけ問題

「パラメータ付きのコンストラクタが一つだけある場合、このクラスのオブジェクトをパラメータなしで作成できますか?なぜですか?」

回答: いいえ!なぜなら、_任意のコンストラクタ_が宣言されると、コンパイラは自動的にデフォルトコンストラクタを追加しなくなるからです。パラメータなしのオブジェクトを作成するには、デフォルトコンストラクタを明示的に宣言する必要があります。


トピックの詳細についての実際のエラー例


逸話

大規模プロジェクトで、データシリアライズのためのクラス階層が作成され、すべての"子"クラスには特定のパラメータ付きコンストラクタのみがありました。リファクタリングの結果、これらのクラスを使用したSTLコンテナ(例:std::vector)でコンパイルエラーが発生しました:コンテナにはデフォルトコンストラクタが必要で、存在しませんでした。この問題は、デフォルトコンストラクタを明示的に宣言することによってのみ解決されました。


逸話

テンプレートを使用するプロジェクトで、リソースを渡すためにパラメータ付きコンストラクタのみを宣言しているアダプタクラスがありました。しかし、ライブラリの一つは正しく機能するためにデフォルトコンストラクタが必要でした(テンプレート型を介して一時オブジェクトを作成する際)。不思議なリンキングエラーが発生し、明示的なデフォルトコンストラクタを実装するまで説明できませんでした。


逸話

C++98からC++11への移行中、デフォルトコンストラクタを明示的に宣言するために"= default"を使用しようとしました。古いコンパイラではエラーが発生したり、新しい構文が無視されたりしました。それにより、すべての開発者がコンパイラによって生成されたデフォルトコンストラクタと新しい"= default"構文の違いを理解しているわけではないことが明らかになりました。