2012-01-17 52 views
1

從其他帖子讀取代碼,我看到類似這樣的東西。來自C++的奇怪代碼段

struct Foo { 
    Foo() : mem(0) {} 
    int mem; 
}; 

mem(0){}在這種情況下會發生什麼情況,特別是關於大括號?我從來沒有見過這個,也不知道我會在哪裏找到這方面的信息。我知道mem(0)會將mem初始化爲0,但爲什麼{}?

謝謝。

+0

可能的重複[這是什麼奇怪的冒號成員語法在構造?](http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the -constructor) – 2012-01-17 10:06:55

+0

[C++ FAQ上的初始化列表](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6) – 2012-01-17 10:19:01

回答

7

由於Foo()是類的構造函數,它必須具有正文,即使成員變量mem已在其外部初始化。

這就是爲什麼,在你的例子中,構造了一個空的身體:

Foo() : mem(0) 
{ 
    // 'mem' is already initialized, but a body is still required. 
} 
+0

是否有必要像這樣編碼它,一個風格問題? – rubixibuc 2012-01-17 10:03:04

+1

這可能是一個風格問題。有些人更喜歡初始化列表,有些更喜歡在構造函數體中進行賦值。但是,一致意見是[使用初始化列表](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6)以避免在某些情況下創建臨時對象。 – 2012-01-17 10:06:09

+0

不,這不是必要的。有人說它有更好的表現,但我認爲如果所有這些影響都應該是微不足道的。根據我的經驗,最好在構造函數的主體中初始化成員。它使調試更容易。 – 2012-01-17 10:06:52

2

它定義了類的構造函數。冒號後的部分是初始化列表,其中mem成員使用構造函數調用初始化爲零。

比較:

int a(0); 
int b = 0; 

這兩個做同樣的,但前者更符合對象一般建築的外觀在C++中。

0

INT C++,你可以定義在.h文件中的方法實現

class MyClass 
{ 
    public: 
    MyClass(){ 
    ..... 
    } 

    void doSomething(){ 
    ..... 
    } 

    ~MyClass(){ 
    ..... 
    } 
}; 

通常它在模板中實現中使用。你也可以使用這種類聲明的方法,以防你想避免鏈接庫,你更願意把所有的代碼都提供給用戶,這樣他就可以包含你的文件,而無需將任何lib文件鏈接到他的項目中。