2011-10-31 165 views
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?? 

我想知道爲什麼有兩種方法來初始化指針。它看起來有點不一致。有一些合乎邏輯的理由,如果是的話,是什麼?或者,也許這是某種遺產?如果是的話,這種符號的起源是什麼?變量初始化(指針和值)

+1

嘗試'新int' VS'新INT()'。 –

+0

嘗試朗讀它們,用* x *'()'發音爲「make an * x *」。 –

+0

現在我很好奇。 'Foo f3'的情況也很有趣。 –

回答

4

這至少有點複雜。

在處理對象時,兩個表示法都是等價的。在處理基本類型時(例如int),(3)將初始化(零填充)該值,而(4)不會(該值將保持未定義)。

對於自動分配的對象,這樣的:

Foo f1; 

聲明並初始化使用默認構造函數Foo對象。這:

Foo f2 = Foo(); 

聲明和使用拷貝構造函數,基本上是複製一個臨時對象(Foo()),它是建立與默認構造函數的值初始化Foo對象。

1

我給你看,這似乎不合邏輯,但如果你考慮可能的含義,這是很有道理的。

不知道什麼Foo可能是,既不是人也不是編譯器(在這裏,人性的角度,更重要的),就能夠確定是否Foo f2 = Foo;是)創建一個新的臨時Foo對象和複印建設有它另外一個或b)將變量Foo的值分配給複製構造對象(f2)。這對我們來說可能是顯而易見的,因爲我們的慣例告訴我們Foo必須是一種大寫的類型,但通常情況並非如此簡單(再次說明:這主要適用於人類讀者,它不必將整個源代碼記住)。

(2)(4)之間的區別在於,對於後者來說,只有一種解釋是容許的,因爲new var(其中var是變量)是不是一個合法的表達。

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