4

基本的に暗黙的に宣言された 4 つの特殊関数があります。

  1. デフォルトのコンストラクタ
  2. デフォルトのデストラクタ
  3. デフォルトの代入演算子
  4. デフォルトのメンバーごとのコピー演算子

質問:

それらのいずれかがユーザーによって定義されている場合、[例: デストラクタ] 残りの 3 つの関数は宣言されません。それは正しいですか?または、デフォルトのコンストラクターにのみ適用され、コンストラクターをコピーしますか?

4

4 に答える 4

5

任意の型 (コピー コンストラクターを含む)の独自のコンストラクターを宣言すると、既定のコンストラクターは暗黙的に宣言されなくなります。残りは (自分で宣言していない限り) です。

ただし、2、3、または 4 のいずれかを宣言していることに気付いた場合は、コンパイラがそれらを暗黙的に宣言したとしても、他の 2 つを宣言する必要があります。これは3 つのルールとして知られています。

Edit in C++11 には、暗黙的に宣言された移動コピー コンストラクター移動代入演算子もあるため、3 のルールは 5 のルールになります。

于 2012-07-26T14:18:43.750 に答える
4

このページの最後に、Howard Hinnant による非常に有益で簡潔な表があります https://howardhinnant.github.io/classdecl.html

ここに画像の説明を入力

于 2020-09-08T21:59:03.740 に答える
3

いいえ、宣言しているからといって、他のものを明示的に宣言する必要はありません。2)ただし、 、3)、のいずれかを宣言する場合は4)、おそらく他のものも宣言する必要があります。

これを 3 のルールと呼びます。 C++11 では5 のルールと呼ばれていると思います。

于 2012-07-26T14:18:38.977 に答える
1

独自の を定義するFoo()と、デフォルト~Foo()が引き続き宣言され、その逆も同様です。代入演算子とコピーコンストラクターと同じです。引数を使用してコンストラクターを定義すると、デフォルトのコンストラクターが失われることに注意してください。取得するには、これを行う必要があります。

class Foo
{
public:
  Foo(); //Declares a default constructor.
  Foo(int);
}
于 2012-07-26T14:19:10.163 に答える