說我有一個結構,看起來像這樣(一POD):默認結構初始化在C++
struct Foo
{
int i;
double d;
};
什麼是以下兩行之間的差異:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
說我有一個結構,看起來像這樣(一POD):默認結構初始化在C++
struct Foo
{
int i;
double d;
};
什麼是以下兩行之間的差異:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
每鏈路I發佈。
在C++中,類和結構之間的唯一區別是,類成員默認是私有的,而struct-members默認爲public。所以結構可以有構造函數,語法和類相同。
重點是構造新對象時使用或省略曲線括號。這個問題適用於類和結構。 – Troubadour 2010-06-01 16:50:31
我想,什麼都沒有。 Foo()
是允許的,即使它沒有任何意義......我試圖將struct
更改爲class
,並嘗試對生成的exe文件進行diff,結果相同,這意味着沒有方法的類就像是一個struct一個實用而「有效」的觀點。
但:如果你只使用替代一個,保持struct
或class
不管了,它發生new Foo
和new 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!)
爲什麼使用括號沒有意義,它調用默認的構造函數。如果有的話,缺乏parens是沒有意義的。 – Salgar 2010-06-01 16:52:48
你在說什麼?這是一個測試,對於問題和foo()通常意味着對函數/方法的調用這一事實似乎是合理的;一個不太有用的測試,而不是閱讀規格,這可能是一個可能的評論家。你的評論對我來說毫無意義。 – ShinTakezou 2010-06-01 18:10:31
請注意相關問題[爲什麼使用一組空括號來調用沒有參數的構造函數時出錯?](http://stackoverflow.com/questions/180172/why-is-it-an-錯誤使用的 - 一個空集,括號到的呼叫-A-構造與 - 無)。 – Troubadour 2010-06-01 16:51:49