型名の後の括弧はnewと関係がありますか? 質問する

型名の後の括弧はnewと関係がありますか? 質問する

「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 つで、気が狂いそうになります。オブジェクトを構築するとき、括弧が必要な場合もあれば、絶対に括弧が使えない場合もあり、括弧があっても問題ない場合もあります。

おすすめ記事