2010-06-01 168 views
7

說我有一個結構,看起來像這樣(一POD):默認結構初始化在C++

struct Foo 
{ 
    int i; 
    double d; 
}; 

什麼是以下兩行之間的差異:

Foo* f1 = new Foo; 
Foo* f2 = new Foo(); 
+0

請注意相關問題[爲什麼使用一組空括號來調用沒有參數的構造函數時出錯?](http://stackoverflow.com/questions/180172/why-is-it-an-錯誤使用的 - 一個空集,括號到的呼叫-A-構造與 - 無)。 – Troubadour 2010-06-01 16:51:49

回答

12

第一個將值初始化;第二個將它們初始化爲零。這只是POD類型的情況,它沒有構造函數。

+0

謝謝!這是唯一的區別嗎? – criddell 2010-06-01 16:58:29

+5

是的,這是唯一的區別。 – 2010-06-01 17:08:46

+0

如果我沒有弄錯,只會在標準(2003?)的一些較新版本中添加 – Suma 2010-06-01 17:54:01

-2

每鏈路I發佈。

在C++中,類和結構之間的唯一區別是,類成員默認是私有的,而struct-members默認爲public。所以結構可以有構造函數,語法和類相同。

Struct Constructor Info

+1

重點是構造新對象時使用或省略曲線括號。這個問題適用於類和結構。 – Troubadour 2010-06-01 16:50:31

1

我想,什麼都沒有。 Foo()是允許的,即使它沒有任何意義......我試圖將struct更改爲class,並嘗試對生成的exe文件進行diff,結果相同,這意味着沒有方法的類就像是一個struct一個實用而「有效」的觀點。

:如果你只使用替代一個,保持structclass不管了,它發生new Foonew Foo()給出了不同的可執行文件! (至少使用g ++)I.e.

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo; delete f1; } 

被編譯成somehing不同

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo(); delete f1; } 

class代替struct同樣的情況。要知道區別在哪裏,我們應該看看生成的代碼......並且要知道它是否是g ++的特性,我應該嘗試使用另一個編譯器,但我現在只有gcc,現在沒時間分析g ++的asm輸出。從「功能」(實用)的角度來說,無論如何,它是一回事。

添加

在結束它始終是更好地瞭解或做對Q/A網站的一些常見的人類問題順藤摸瓜......在由g ++中生成的代碼的唯一區別()和否()情況下,

 
    movl $0, (%eax) 
    fldz 
    fstpl 4(%eax) 

這是初始化爲0/0.0的INT和結構的雙重片段...所以西摩知道它更好的(但我可能不知道,如果我發現了它首先看看asm!)

+0

爲什麼使用括號沒有意義,它調用默認的構造函數。如果有的話,缺乏parens是沒有意義的。 – Salgar 2010-06-01 16:52:48

+0

你在說什麼?這是一個測試,對於問題和foo()通常意味着對函數/方法的調用這一事實似乎是合理的;一個不太有用的測試,而不是閱讀規格,這可能是一個可能的評論家。你的評論對我來說毫無意義。 – ShinTakezou 2010-06-01 18:10:31