4
Foo f1 = Foo();      // (1) Ok
Foo f2 = Foo;        // (2) Compiler error

Foo *p1 = new Foo(); // (3) Ok
Foo *p2 = new Foo;   // (4) Ok. Why??

ポインターを初期化する方法が 2 つあるのはなぜだろうと思っていました。少し矛盾しているように見えます。何らかの論理的な理由がありますか? もしそうなら、それは何ですか? それとも、ある種の遺産ですか?もしそうなら、そのような表記の由来は何ですか?

4

3 に答える 3

4

控えめに言っても、それは少し...複雑です。

オブジェクトを扱う場合、両方の表記法は同等です。プリミティブ型(などint)を処理(3)する場合、は値を初期化します(ゼロフィル)が、そうで(4)はありません(値は未定義のままになります)。

自動的に割り当てられたオブジェクトの場合、これは次のとおりです。

Foo f1;

Fooデフォルトのコンストラクターを使用して、オブジェクトを宣言および初期化します。これ:

Foo f2 = Foo();

Fooコピーコンストラクターを使用してオブジェクトを宣言および初期化します。基本的Foo()に、デフォルトのコンストラクターでビルドされた一時オブジェクト()の値をコピーします。

于 2011-10-31T23:44:15.013 に答える
1

スコープベースのリソースの 4 に相当するのは、実際には

Foo f;

相違点の従来の理由は、基本的に、C では などのプリミティブ型intがデフォルトで有用なものに初期化されていなかったためです。当時、C++ はパフォーマンス上の理由からこの動作を継承していました。もちろん、今では、消費するプロセッサ時間はごくわずかです。C++ では、常に初期化される新しい構文 (ブラケット) が導入されました。

int i = int();

iは常に 0 であることが保証されています。

int i;

の値iは未定義です。

これは、いくつかのnew:

int* i = new int(); // guaranteed 0
int* i = new int; // undefined
于 2011-11-01T01:50:46.527 に答える
1

非論理的に思えるかもしれませんが、考えられる意味を考えれば、非常に理にかなっています。

何が何であるかを知らなければFoo、人間もコンパイラ (ここでは人間の視点がより重要です) もFoo f2 = Foo;、a) 新しい一時Fooオブジェクトを作成し、それを使用して別のオブジェクトをコピーして構築するか、b) の値を割り当てるかを判断できません。Fooコピー構築オブジェクト ( ) への変数f2。私たちの規則Fooでは、 は大文字で始まる型でなければならないことを示しているため、明白に思えるかもしれませんが、一般的にはそれほど単純ではありません (繰り返しますが、これは主に、必ずしもソース コード全体を記憶しているわけではない人間の読者に適用されます)。 .

(2)との違いは(4)、後者の場合、new var(where varis a variable) は正当な表現ではないため、1 つの解釈のみが許容されることです。

于 2011-11-01T01:34:56.013 に答える