Foo f1 = Foo(); // (1) Ok
Foo f2 = Foo; // (2) Compiler error
Foo *p1 = new Foo(); // (3) Ok
Foo *p2 = new Foo; // (4) Ok. Why??
我想知道爲什麼有兩種方法來初始化指針。它看起來有點不一致。有一些合乎邏輯的理由,如果是的話,是什麼?或者,也許這是某種遺產?如果是的話,這種符號的起源是什麼?變量初始化(指針和值)
Foo f1 = Foo(); // (1) Ok
Foo f2 = Foo; // (2) Compiler error
Foo *p1 = new Foo(); // (3) Ok
Foo *p2 = new Foo; // (4) Ok. Why??
我想知道爲什麼有兩種方法來初始化指針。它看起來有點不一致。有一些合乎邏輯的理由,如果是的話,是什麼?或者,也許這是某種遺產?如果是的話,這種符號的起源是什麼?變量初始化(指針和值)
這至少有點複雜。
在處理對象時,兩個表示法都是等價的。在處理基本類型時(例如int
),(3)
將初始化(零填充)該值,而(4)
不會(該值將保持未定義)。
對於自動分配的對象,這樣的:
Foo f1;
聲明並初始化使用默認構造函數Foo
對象。這:
Foo f2 = Foo();
聲明和使用拷貝構造函數,基本上是複製一個臨時對象(Foo()
),它是建立與默認構造函數的值初始化Foo
對象。
我給你看,這似乎不合邏輯,但如果你考慮可能的含義,這是很有道理的。
不知道什麼Foo
可能是,既不是人也不是編譯器(在這裏,人性的角度,更重要的),就能夠確定是否Foo f2 = Foo;
是)創建一個新的臨時Foo
對象和複印建設有它另外一個或b)將變量Foo
的值分配給複製構造對象(f2
)。這對我們來說可能是顯而易見的,因爲我們的慣例告訴我們Foo
必須是一種大寫的類型,但通常情況並非如此簡單(再次說明:這主要適用於人類讀者,它不必將整個源代碼記住)。
(2)
和(4)
之間的區別在於,對於後者來說,只有一種解釋是容許的,因爲new var
(其中var
是變量)是不是一個合法的表達。
的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
嘗試'新int' VS'新INT()'。 –
嘗試朗讀它們,用* x *'()'發音爲「make an * x *」。 –
現在我很好奇。 'Foo f3'的情況也很有趣。 –