2
struct Base{
    Base(Base &){}        // suppress default constructor
};

struct Derived : Base{
};

int main(){
    Derived d;
}

'Base' の既定のコンストラクター (暗黙的) が抑制されているため、示されているコードはエラーを返します。確かに、標準は$ 12.1と言っています"If there is no user-declared constructor for class X, a default constructor is implicitly declared."

次の 3 つのことがあります。

a) ユーザーが宣言したコンストラクターがクラスに存在する場合、デフォルトのコンストラクター (暗黙的) が抑制されると標準はどこでも述べていますか? それは基本的に上記の否定的な言い回しですか、それとももう一度暗示されています:)?

b) なぜそのようになったのですか?

c) デフォルトのデストラクタに同じ規則が適用されないのはなぜですか?

4

3 に答える 3

7

a)はあなたの引用によって十分に明確に暗示されていると思います。

「理由」については非常に単純です。デフォルトのコンストラクターは常に意味があるとは限りません。これを抑制する方法がないと、C++ が大幅に弱体化します。

c) に関しては、デストラクタのないクラス (「デフォルト」ではなく、単純なデストラクタのみ) はまったく意味がありません。

于 2010-09-13T14:23:47.293 に答える
1

a) ユーザーが宣言したコンストラクターがクラスに存在する場合、デフォルトのコンストラクター (暗黙的) が抑制されると標準はどこでも述べていますか? それは基本的に上記の否定的な言い回しですか、それとももう一度暗示されています:)?

はい、そういう意味です

b) Why is it that way?

ほとんどの場合、ユーザー定義のコンストラクターがある場合は、オブジェクトを初期化するために特別な作業を行う必要があることを意味します。このような場合、暗黙的に生成されたデフォルト コンストラクターを無効にすることは理にかなっています。

c) Why the same rules do not apply for the default destructor?

おそらく、言語が「3 つのルール」 (コピー コンストラクター、代入演算子、またはデストラクターのいずれかを定義する場合、3 つすべてを実装する必要がある可能性があります) を強制することは理にかなっていますが、そうではありません。

おそらく、クラスを初期化する方法はいくつかありますが、割り当てと破棄は同じように機能することが多いというのがその理由です (メンバーごとの割り当て、すべてのメンバーのデストラクタの実行)。

于 2010-09-13T15:01:30.460 に答える
1

最短の答えは、クラス Base のコンストラクターを宣言したためです。デフォルトのコンストラクターは作成されません (したがって、抑制)。Derived にはクラス Base で呼び出す既定のコンストラクターがないため、Derived を初期化できません。(これは、生成された派生の既定のコンストラクターが、既定のコンストラクターを使用して親クラスのみを構築できるためです)

于 2010-09-13T14:24:35.713 に答える