[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
質問
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 A
と
new A()
というのは、AはPODだからです。
また、C++98とC++03では、以下のようなケースで動作に違いがあります。
new B()
.
これはC++の埃っぽいコーナーの1つで、気が狂いそうになることがあります。オブジェクトを構築するとき、あるときはペレンが必要であり、あるときは絶対に必要でなく、あるときはどうでもいいのです。
関連
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 配列のベクトルを扱う正しい方法