12

スタック上に存在するC++で新しいオブジェクトを作成するとき(私がほとんど見た方法で)、これを行います。

CDPlayer player;

ヒープ上にオブジェクトを作成するときは、次のように呼び出しますnew

CDPlayer* player = new CDPlayer();

しかし、これを行うと:

CDPlayer player=CDPlayer();

スタックベースのオブジェクトを作成しますが、それと一番上の例の違いは何ですか?

4

2 に答える 2

24

この違いは、デフォルトの初期化値の初期化に違いがあるPOD(基本的に、、などのすべての組み込みタイプにint加えbooldouble、他のPODからのみ構築されたCのような構造体と共用体)では重要です。PODの場合、単純な

T obj;

objデフォルトではオブジェクトを初期化しますが、初期化されないままになりT()ます。それで

T obj = T();

オブジェクトが適切に初期化されていることを確認するための良い方法です。

Tこれは、PODタイプまたは非PODタイプのテンプレートコードで特に役立ちます。TそれがPODタイプではないことがわかっている場合は、T obj;それで十分です。

補遺:あなたはまた書くことができます

T* ptr = new T; // note the missing ()

T(がPODの場合は、割り当てられたオブジェクトの初期化を避けてください)。

于 2010-09-17T13:50:31.337 に答える
8

スタック上に存在するC++で新しいオブジェクトを作成する場合、(…)これを行います。

CDPlayer player;

必ずしもスタック上にある必要はありません。この方法で宣言された変数には自動ストレージがあります。彼らが実際に行く場所は異なります。スタック上にある場合もありますが(特に宣言がメソッド内にある場合)、別の場所にある場合もあります。

宣言がクラス内にある場合を考えてみましょう。

class foo {
    int x;
};

これで、のストレージはxクラスインスタンスが保存される場所になります。ヒープに格納されている場合は、次のようになりますx

foo* pf = new foo(); // pf.x lives on the heap.
foo f; // f.x lives where f lives, which has (once again) automatic storage.
于 2010-09-17T13:52:54.773 に答える