2012-07-30 57 views
2

在下面C++代碼:這個結構試圖做什麼?

struct Features { 
    int F1; 
    int F2; 
    int F3; 
    int F4; 
    Features(int F1,int F2,int F3,int F4) 
    : F1(F1), F2(F2), F3(F3), F4(F4) { } 
}; 

是什麼意思一部分?

Features(int F1,int F2,int F3,int F4) 
     : F1(F1), F2(F2), F3(F3), F4(F4) { } 

謝謝。

回答

8

它正在初始化使用構造函數的初始化列表中的成員變量。它會更清楚,如果構造函數參數的名字是不一樣的數據成員:

Features(int a,int b,int c,int d) 
     : F1(a), F2(b), F3(c), F4(d) { } 

有數據成員的一些命名約定,這樣,這些都是很容易識別,並從當地區分它是有用的代碼中的變量。實例前綴的m_或使用後_

struct Features { 
    int m_f1; 
    int m_f2; 
    int m_3f; 
    int m_f4; 
    Features(int f1,int f2,int f3,int f4) 
    : m_f1(f1), m_f2(f2), m_f3(f3), m_f4(f4) { } 
}; 

這兩個構造函數可以被使用如下:

Features f(11,22,33,44); 
std::cout << f.m_f1 << "\n"; // prints 11 
std::cout << f.m_f2 << "\n"; // prints 22 
std::cout << f.m_f3 << "\n"; // prints 33 
std::cout << f.m_f4 << "\n"; // prints 44 

注意,此構造被定義的事實意味着,編譯器將沒有再提供一個默認的構造函數。所以,如果你希望能夠到這一點:

Features f; 

,那麼你需要提供自己的默認構造函數:

Features() : m_f1(), m_f2(), m_f3(), m_f4() {} // initializes data members to 0 
+0

我相信你知道那個juancho,但是對於清晰度:它們不一樣,因爲C++區分大小寫。 'f1'不是'F1'。 – steffen 2012-07-30 13:13:09

+0

@juanchopanza。在這種情況下,我們將mamber變量初始化爲什麼?換句話說,這裏的成員變量是什麼值?由於它們是「int」類型,它們是否具有值「0」? – Simplicity 2012-07-30 13:18:41

+0

它們被初始化爲傳遞給'Features'構造函數的參數。我添加了一個小例子。 – juanchopanza 2012-07-30 13:21:28

2

它的成員變量初始化

你可以這樣來做:

Features(int F1,int F2,int F3,int F4) 
{ 
    this->F1 = F1; 
    this->F2 = F2; 
    this->F3 = F3; 
    this->F4 = F4; 
} 

Features(int F1,int F2,int F3,int F4) 
     : F1(F1), F2(F2), F3(F3), F4(F4) { } 

是首選,因爲對於用戶自定義類型的默認構造函數會自動調用並能給你一些開銷。如果您的成員變量沒有默認構造函數,則需要在初始化程序列表中初始化它們。恆字段必須在初始化列表中被初始化以及

同時,我認爲它只是更加明確使用初始化列表

+1

你可能想說爲什麼它是首選(即:因爲會員保證被初始化) – 2012-07-30 13:12:35

+0

@PauldeLange:我在說,但打字速度有限) – Andrew 2012-07-30 13:13:04

1

this tutorial讀。它應該回答你的問題。

+0

@downvoter:小心解釋爲什麼?我在答案中鏈接的教程包含對該問題的詳細解釋。 – 2012-07-30 13:14:44

+0

其他帖子在這裏回答問題,這是首選,並獲得更多的選票。鏈接適用於Google。 – 2012-07-30 13:38:54

+0

好的,表示同意。我沒有得到任何慷慨的回答,但爲什麼降價? – 2012-07-30 13:39:59