2

開発者によって明示的に宣言されたdestructorandを持たないクラスの場合を考えてみましょう。この場合、 for a class になることconstructorを理解しています。では、クラスのオブジェクトが破棄されようとしている場合にのみ、 が であるというのは本当ですか?destructorimplicitly declareddestructorimplicitly defined

コンストラクタの振る舞いも上記と同じです。implicitly definedクラスのオブジェクトが作成されたときだけですか?

編集

class A {
  public:

};
int main() {

}

上記のコードでは、~A() が暗黙的に宣言されます。私の質問は、クラスのオブジェクトが次のようにインスタンス化されている場合にのみ、デストラクタの定義が暗黙的に行われるというのが本当かどうかです

class A {
      public:

    };
    int main() {
      A a;
    }

それとも、オブジェクトのインスタンス化が行われていない場合でも、暗黙的に定義されていますか?

4

3 に答える 3

5

はい、暗黙的に宣言されたデフォルトのコンストラクターとデストラクタは、オブジェクトのインスタンスを作成または破棄するために使用されるときに暗黙的に定義されます。標準(C++ 11)の言葉で:

12.1/6: デフォルト設定され、削除済みとして定義されていないデフォルト コンストラクターは、そのクラス型 (1.8) のオブジェクトを作成するために ODR を使用 (3.2) するとき、または最初の宣言後に明示的にデフォルト設定されるときに、暗黙的に定義されます。

12.4/5: デフォルト設定されていて削除済みとして定義されていないデストラクタは、そのクラス型 (3.7) のオブジェクトを破棄するために ODR を使用 (3.2) した場合、または最初の宣言後に明示的にデフォルト設定された場合に暗黙的に定義されます。

したがって、それらは type のオブジェクトを作成および破棄する 2 番目のコード スニペットで定義されていますが、Aそうでない最初のコード スニペットでは定義されていません。

于 2011-12-19T15:07:20.297 に答える
0

一方では、自明でないプログラムでオブジェクトが作成/破棄されたかどうかを判断することはしばしば不可能です*。

ただし、 と の間には細い線がdefined when object created/destroyedありdefined if neededます。以下の私の例では、Foo::Foo()必要になる可能性があるため、定義する必要があります。ただし、オブジェクトの作成時に定義されているかどうかを尋ねますが、後者は決定できません。


*:

class Foo {};
int main(int argc, char *argv[]) {
    if (argc>1) Foo(); // <- impossible to decide if ever constructed/destroyed
}

// On the other hand, compiler might be smart enough to observe that
// Foo does not have any visible behaviour, remove Foo entirely, and in
// effect spit out this:
int main() {}
于 2011-12-19T15:01:33.130 に答える
0

関数が定義されているかどうかは実行時に決定されるものではないため、実行可能ファイルが静的であり、特定の実行用に作成されていないという理由だけで、「オブジェクト [..] が破棄されようとしている場合にのみ」デストラクタを定義することはできません。

ただし、デストラクタへの呼び出しが最終的な実行可能ファイルに存在しない場合、リンカーは関数を完全に削除することを選択する可能性があります。


最後のポイントとして、次の例を検討してください。

class A {
  A() {}
  ~A() {}
};
class B {
  A a; // cannot access dtor nor ctor of A
};

一度もインスタンス化しない場合、Bこれは実際にコンパイルおよびリンクされます。ただし、コンパイラーのオブジェクトを作成しようとすると、強制的に合成することができず、それができないという理由だけで、いくつかのカラフルな名前が呼び出されます。B::B()B::~B()BB::B()B::~B()

于 2011-12-19T15:01:50.957 に答える