-1

ユーザー定義型のオブジェクトを作成するプロセスを知りたいです。

class A{
    int a; 
    void f();
    int b;
    A() /*initialization list*/ {}
};

int main(){
    A ob;
}

1)オブジェクトが割り当てられる時刻と、のコンストラクターが呼び出される時刻を知りたいA
2)そのメンバーはいつ割り当てられますか? オブジェクト自体が割り当てられるのと同時にですか?
3)オブジェクトが完全に作成され、安全に使用できるといつ言えますか? コンストラクターの開始直後ですか、それともコンストラクターの終了までですか?
4)コンストラクターの初期化リストでメンバーが初期化されることを知っているので、コンストラクターの呼び出しの前です。オブジェクトが存在する前にメンバーが存在するということですか?

5)オブジェクトの割り当てが解除されるのはいつですか? デストラクタが終了する前ですか?

4

6 に答える 6

2
  1. 「A ob;」の行。最初にオブジェクト用のストレージが割り当てられ、次にコンストラクターが呼び出されます。
  2. オブジェクトコンストラクター呼び出しの直前です。
  3. コンストラクターが完了していない場合は、オブジェクトはまだ作成されていません。コンストラクタで例外が発生した場合、デストラクタは呼び出されません。
  4. はい。オブジェクトは存在しませんが、割り当てられています。
  5. オブジェクトは、デストラクタの呼び出し後に (コンストラクターで例外があった場合は呼び出しなしで) 割り当て解除されます。

いくつかの追加情報

于 2012-10-19T09:59:51.790 に答える
0

最初に、クラスのパブリックセクションにコンストラクターを宣言する必要があります。

  1. メモリ割り当ては、オブジェクトが作成されたときに発生します(あなたにとって、それはスタックに割り当てられます)
  2. オブジェクトの作成時にメンバーが割り当てられます
  3. オブジェクトが作成された後(あなたの場合、A ob
  4. いいえ、メンバーはコンストラクターを作成する瞬間に初期化します
  5. 最初にデストラクタを呼び出し、次に割り当てを解除します

注:標準のс++では、静的メンバーの初期化の順序は指定されていません。コンパイラによって異なります。

于 2012-10-19T10:14:11.053 に答える
0

1.オブジェクト コンストラクターが呼び出されるとオブジェクトが割り当てられ、クラスのオブジェクトを作成するときにオブジェクト コンストラクターが呼び出されます。
2.
3.すべてのメンバーを初期化する必要があるため、コンストラクターの最後
4.
5.デストラクタが呼び出された後。

于 2012-10-19T10:00:35.877 に答える
0

オブジェクトが定義されているスコープに入ると、オブジェクトが作成されます。

最初にオブジェクトを割り当ててから、そのコンストラクターを呼び出します。オブジェクトは、コンストラクターの実行の最後に安全に使用できます。オブジェクト予約sizeof(A)を割り当てると、各メンバーが同時に割り当てられます (これがメンバーと呼ばれる理由です)。

初期化リストはコンストラクターが実行される前に呼び出されますが、この時点ではすでに割り当てられているため、オブジェクトが存在するため、それらを初期化しても安全です。

オブジェクトは、デストラクタの実行前ではなく、最後に割り当て解除されます。

于 2012-10-19T09:56:00.430 に答える
0

1)あなたのA ob;行にありますが、ヒープではなくスタックに割り当てられます!

2)コンストラクターが呼び出されるので、そうです。

3)デフォルトのコンストラクタを使用する場合、はい、できます

4) 3 と同じ質問のように見えるので、はい

5) いいえ、デストラクタでメンバーにアクセスできます

于 2012-10-19T09:56:19.590 に答える
0
  1. 最初に、インスタンスのメモリclass Aが割り当てられます。これには、そのメンバーによって占有されているメモリが含まれます。その後、コンストラクターA::A()が呼び出されます。
  2. はい、上記を参照してください。
  3. 答えは、「完全に作成された」という定義によって異なります。コンストラクターの本体では、ほとんどすべてのことを安全に行うことができますが、注意が必要です。最もよく知られているのは、仮想メソッド呼び出しに関するものです。
  4. コンストラクターの初期化リストはコンストラクターの一部であり、制御フローがコンストラクターの開始ブレースに到達する前に実行されます。
  5. 破棄時には、デストラクタA::~A()が最初に呼び出され、次にオブジェクトが占有していたメモリの割り当てが解除されます。
于 2012-10-19T09:56:55.970 に答える