独自の明示的なコンストラクターを提供しても、コンパイラーにデフォルトのコンストラクターを作成させる方法はありますか?
時々私はそれらが非常に便利だと思うことがあり、特に大きなクラスの場合、コピー コンストラクターなどを書くのは時間の無駄だと思います。
独自の明示的なコンストラクターを提供しても、コンパイラーにデフォルトのコンストラクターを作成させる方法はありますか?
時々私はそれらが非常に便利だと思うことがあり、特に大きなクラスの場合、コピー コンストラクターなどを書くのは時間の無駄だと思います。
できません-コンパイラは、独自のデフォルトコンストラクタを提供するときに、自動生成されたデフォルトコンストラクタの一部をオフにするため、特定のクラスをそのようにデフォルトで構築することを防ぐことができます。ただし、C ++ 0xを使用すると、デフォルトのコンパイラ実装を明示的に指定できると思います。例:
MyClass() = default; // 'delete' also allowed by upcoming standard to disable
まだこれをサポートしているコンパイラはないと思います-C++0x(次の標準が知られているため)はまだ最終版ではないので、今のところデフォルトのコンストラクタを入力する必要があります。それは多くのコードではありません! MyClass() {}
すべてのメンバー自体がデフォルトで構築可能である限り、実行されます。
コピーコンストラクターは、他のコンストラクターを定義するかどうかに関係なく提供されます。コピーコンストラクターを宣言しない限り、コピーコンストラクターを取得します。
no-argコンストラクターは、コンストラクターを宣言しない場合にのみ提供されます。したがって、引数なしのコンストラクターが必要でない限り問題はありませんが、コンストラクターを作成するのは時間の無駄だと考えてください。
IIRC、C ++ 0xには、構築を別のコンストラクターに委任する方法があります。詳細は思い出せませんが、別のコンストラクターとそれに渡す引数を指定することで、引数のないコンストラクターを定義できます。場合によっては、一部のデータメンバー初期化子を入力する手間が省ける可能性があります。ただし、デフォルトの引数なしコンストラクターは、これらの初期化子も提供していません。
コピーコンストラクターの独自の定義を提供しない限り、コンパイラーは常にデフォルトのコピーコンストラクターを生成します。問題は、デフォルトの引数なしコンストラクターにのみあります。これは、コンストラクター定義が存在する場合は生成されません。しかし、生成されたものとまったく同じように動作する引数なしのコンストラクターを提供することはそれほど難しくありません。
class yourClass
{
public:
yourClass(){}
}