2013-02-20 213 views
1

我在頭文件中有一個靜態變量。例如:靜態變量的哪個初始化是正確的

頭文件

class Fruits{ 
    public: 
     static int colour; 
} 

在cpp文件包括頭之後,是它更好地寫:

int Fruits::colour=1; 

int Fruits::colour(1); 

有人告訴我,第一個不是變量的初始化,而是另一個的聲明。什麼是設置初始化的正確方式和地點?

+2

請不要標記C++問題'c'。 – 2013-02-20 15:09:52

+0

[Initializing private static members]可能的重複(http://stackoverflow.com/questions/185844/initializing-private-static-members) – egrunin 2013-02-20 15:12:15

+0

這個問題太廣泛了。首先你需要這個http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initializati(還有其他問題也回答了這個問題,特別是如果你不知道這些條款),那麼你需要上面發佈的那個。 – djechlin 2013-02-20 15:15:20

回答

4

當C++正在設計他們決定,以保持一致性與早期代碼,type X = y;將被視爲等同於type X(y);爲內置類型。你給出的靜態初始化的兩個例子因此被編譯器視爲完全相同,並且只是編寫相同事物的不同方式。

對於類,它變得更加複雜。在很多情況下,type X = ytype X(y)是可以互換的,但是,在某些情況下會導致不同的結果。詳細討論了this question的答案。

+0

還有一個問題。我問的是,初始化一個新變量的初始化或者我在頭文件中聲明的相同靜態的初始化會導致一些人困惑。 – kyrpav 2013-02-20 15:30:49

+0

它們對於所有類型都不是「完全相同」 - 類型X = y;將無法編譯爲不可移動類型,而類型X(y);將適用於所有類型(適當可轉換)。 – 2013-02-20 15:31:20

+0

所以你可以回答如果這是聲明和一個新變量的定義不同於我在頭中聲明的變量?還有什麼是不可移動的類型? – kyrpav 2013-02-20 15:36:19

2

這兩行代碼是等價的,都是初始化。

0

第一種解決方案看起來一切正常。你可以使用這個。據我所知,另一種方式沒有被使用。

請參閱here

3

它們是相同的,所不同的是第一個使用複製初始化語法(見C++ 11標準第8.5/14):

T a = b; 

而第二個使用指示按初始化語法(見段落中的C++ 11標準的8.5/15):

T a(b); // C++11 also supports T a{b}; 

對於非類類型,這兩個是相同的。

2

對於簡單的類型,如int,兩者都是等效的。

對於類類型,有一個區別:第一個將複製或移動初始化臨時對象,而第二個將直接初始化該命名變量。在實踐中,複製或移動將被消除,兩者都會完成相同的事情;但如果課程既不可複製也不可移動,則第一課將無法編譯。

所以最好使用第二種類的類型;如果你喜歡一致性,你可能更喜歡將它用於所有類型。

0

兩者都在操作中相當於,雖然

在這種情況下int Fruits::colour(1);,如果colour是的不同class對象那麼它會調用構造(或如果提供相同的class的另一個目的,它會叫複製構造函數)。

由於類型是int這是一種基本類型,因此它們都是等效的並且同等有效。

1

「但另一宣言」

是的,這是另一種只有一個聲明,如果你在不同的頭部多次定義它。但是隻在聲明它的文件中定義它,那麼它是一樣的。