「Test」が通常のクラスである場合、次のクラスの間に違いはありますか?
Test* test = new Test;
そして
Test* test = new Test();
ベストアンサー1
細かいことを言いましょう。コードの動作に実際に影響する違いがあるからです。以下の大部分はOld New Thingの記事へのコメントから引用したものです。
new演算子によって返されるメモリは、新しい型がPOD (プレーンオールドデータ)または、POD メンバーを含み、コンパイラによって生成されたデフォルト コンストラクターを使用しているクラスの場合。
- C++1998では、ゼロとデフォルトの2種類の初期化があります。
- C++2003 では、3 番目のタイプの初期化である値の初期化が追加されました。
仮定する:
struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
C++98 コンパイラでは、次のことが起こるはずです。
new A
- 不確定な値new A()
- ゼロ初期化new B
- デフォルト構成(B::m は初期化されていません)new B()
- デフォルト構成(B::m は初期化されていません)new C
- デフォルト構成(C::m はゼロ初期化されます)new C()
- デフォルト構成(C::m はゼロ初期化されます)
C++03 準拠コンパイラでは、次のように動作するはずです。
new A
- 不確定な値new A()
- A を value-initialize します。これは POD なのでゼロ初期化です。new B
- デフォルトで初期化します(B::m は初期化されないままになります)new B()
- B を値初期化します。B のデフォルト コンストラクターはユーザー定義ではなくコンパイラによって生成されるため、すべてのフィールドがゼロ初期化されます。new C
- デフォルトのコンストラクターを呼び出す C をデフォルトで初期化します。new C()
- デフォルトのコンストラクターを呼び出す C を値初期化します。
したがって、C++ のすべてのバージョンでは、A が POD であるためnew A
、 との間には違いがあります。new A()
また、 の場合、C++98 と C++03 では動作が異なりますnew B()
。
これは、C++ の埃っぽい隅っこの 1 つで、気が狂いそうになります。オブジェクトを構築するとき、括弧が必要な場合もあれば、絶対に括弧が使えない場合もあり、括弧があっても問題ない場合もあります。