我在頭文件中有一個靜態變量。例如:靜態變量的哪個初始化是正確的
頭文件
class Fruits{
public:
static int colour;
}
在cpp文件包括頭之後,是它更好地寫:
int Fruits::colour=1;
或
int Fruits::colour(1);
有人告訴我,第一個不是變量的初始化,而是另一個的聲明。什麼是設置初始化的正確方式和地點?
我在頭文件中有一個靜態變量。例如:靜態變量的哪個初始化是正確的
頭文件
class Fruits{
public:
static int colour;
}
在cpp文件包括頭之後,是它更好地寫:
int Fruits::colour=1;
或
int Fruits::colour(1);
有人告訴我,第一個不是變量的初始化,而是另一個的聲明。什麼是設置初始化的正確方式和地點?
當C++正在設計他們決定,以保持一致性與早期代碼,type X = y;
將被視爲等同於type X(y);
爲內置類型。你給出的靜態初始化的兩個例子因此被編譯器視爲完全相同,並且只是編寫相同事物的不同方式。
對於類,它變得更加複雜。在很多情況下,type X = y
和type X(y)
是可以互換的,但是,在某些情況下會導致不同的結果。詳細討論了this question的答案。
這兩行代碼是等價的,都是初始化。
第一種解決方案看起來一切正常。你可以使用這個。據我所知,另一種方式沒有被使用。
請參閱here。
它們是相同的,所不同的是第一個使用複製初始化語法(見C++ 11標準第8.5/14):
T a = b;
而第二個使用指示按初始化語法(見段落中的C++ 11標準的8.5/15):
T a(b); // C++11 also supports T a{b};
對於非類類型,這兩個是相同的。
對於簡單的類型,如int
,兩者都是等效的。
對於類類型,有一個區別:第一個將複製或移動初始化臨時對象,而第二個將直接初始化該命名變量。在實踐中,複製或移動將被消除,兩者都會完成相同的事情;但如果課程既不可複製也不可移動,則第一課將無法編譯。
所以最好使用第二種類的類型;如果你喜歡一致性,你可能更喜歡將它用於所有類型。
兩者都在操作中相當於,雖然
在這種情況下int Fruits::colour(1);
,如果colour
是的不同class
對象那麼它會調用構造(或如果提供相同的class
的另一個目的,它會叫複製構造函數)。
由於類型是int
這是一種基本類型,因此它們都是等效的並且同等有效。
「但另一宣言」
是的,這是另一種只有一個聲明,如果你在不同的頭部多次定義它。但是隻在聲明它的文件中定義它,那麼它是一樣的。
請不要標記C++問題'c'。 – 2013-02-20 15:09:52
[Initializing private static members]可能的重複(http://stackoverflow.com/questions/185844/initializing-private-static-members) – egrunin 2013-02-20 15:12:15
這個問題太廣泛了。首先你需要這個http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initializati(還有其他問題也回答了這個問題,特別是如果你不知道這些條款),那麼你需要上面發佈的那個。 – djechlin 2013-02-20 15:15:20