2010-08-26 58 views
3

我知道如何初始化一個不是整數的靜態成員,但我想知道,這個語法的基本原理是什麼?我想能夠只是把值類,比如你可以用一個整數成員,一拉:靜態const(非整型)成員初始化語法的基本原理?

class A { 
    static const int i = 3; 
}; 

我意識到這可能意味着更多的重建,如果我改變的價值,因爲它是一個變化在頭文件中 - 但在某些情況下,這種情況不太可能發生 - 和修改頭文件中的#define一樣糟糕。

它似乎並不像編譯器所能理解的那樣困難。是否有技術上的原因,爲什麼它的工作方式?還是隻是編譯器執行將實現與定義分開的良好實踐的情況?

回答

6

因爲這是類別的聲明。你還沒有任何物體。

您需要實際上定義值某處---某處特定。

由於它是static它實際上佔據了某處的空間。但是,由於具有該聲明的.H文件可以包含在許多源文件中,哪一個文件定義了哪個文件保存了它正在使用的實際空間?讓編譯器自動定義每個對象文件中的空間並讓鏈接器將其排除將違反「One Definition Rule」。

1

靜態類成員具有鏈接,因此它需要位於源文件中。僅僅因爲你聲明它並不意味着它真的不能改變(例如,請查看volatile)。

這可以幫助你:

class A { 
    enum { i = 3 }; // use an enum to set a constant value in the class declaration 
    void f() { int k = int(i); } 
} 
+1

你可以* *初始化類爲OP節目內的靜態常量*整數類型*。我認爲這個問題是關於其他類型的。 – UncleBens 2010-08-26 15:43:47