基本的に暗黙的に宣言された 4 つの特殊関数があります。
- デフォルトのコンストラクタ
- デフォルトのデストラクタ
- デフォルトの代入演算子
- デフォルトのメンバーごとのコピー演算子
質問:
それらのいずれかがユーザーによって定義されている場合、[例: デストラクタ] 残りの 3 つの関数は宣言されません。それは正しいですか?または、デフォルトのコンストラクターにのみ適用され、コンストラクターをコピーしますか?
基本的に暗黙的に宣言された 4 つの特殊関数があります。
質問:
それらのいずれかがユーザーによって定義されている場合、[例: デストラクタ] 残りの 3 つの関数は宣言されません。それは正しいですか?または、デフォルトのコンストラクターにのみ適用され、コンストラクターをコピーしますか?
任意の型 (コピー コンストラクターを含む)の独自のコンストラクターを宣言すると、既定のコンストラクターは暗黙的に宣言されなくなります。残りは (自分で宣言していない限り) です。
ただし、2、3、または 4 のいずれかを宣言していることに気付いた場合は、コンパイラがそれらを暗黙的に宣言したとしても、他の 2 つを宣言する必要があります。これは3 つのルールとして知られています。
Edit in C++11 には、暗黙的に宣言された移動コピー コンストラクターと移動代入演算子もあるため、3 のルールは 5 のルールになります。
このページの最後に、Howard Hinnant による非常に有益で簡潔な表があります https://howardhinnant.github.io/classdecl.html
独自の を定義するFoo()
と、デフォルト~Foo()
が引き続き宣言され、その逆も同様です。代入演算子とコピーコンストラクターと同じです。引数を使用してコンストラクターを定義すると、デフォルトのコンストラクターが失われることに注意してください。取得するには、これを行う必要があります。
class Foo
{
public:
Foo(); //Declares a default constructor.
Foo(int);
}