1. ホーム
  2. c++

[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?

2022-03-16 19:13:37

質問

Test'が普通のクラスだとしたら、何か違いがあるのでしょうか。

Test* test = new Test;

そして

Test* test = new Test();

解決方法は?

実際にコードの動作に影響を与えるような違いがあるので、衒学的に考えてみましょう。以下は、多くの場合 古いものから新しいものへ"記事 .

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() - value-initialize Aは、PODなのでゼロ初期化です。

  • new B - default-initializes (B::mを初期化しないままにしておく)

  • new B() - デフォルトの Ctor がユーザー定義ではなく、コンパイラで生成されるため、すべてのフィールドをゼロ初期化する B を値で初期化します。

  • new C - default-initializesはCを初期化し、デフォルトのctorを呼び出します。

  • new C() - 値はCを初期化し、デフォルトのctorを呼び出します。

つまり、C++のすべてのバージョンで、以下の違いがあります。 new Anew A() というのは、AはPODだからです。

また、C++98とC++03では、以下のようなケースで動作に違いがあります。 new B() .

これはC++の埃っぽいコーナーの1つで、気が狂いそうになることがあります。オブジェクトを構築するとき、あるときはペレンが必要であり、あるときは絶対に必要でなく、あるときはどうでもいいのです。