沒有躲過的坑--類中的靜態成員變數(static or const static)
阿新 • • 發佈:2019-01-01
工作中是這樣的,A類中有一個成員變數x,最開始宣告為私有:
class A{
private:
int x;
};
現在需要在另一個cpp中使用這個x,所以要把它變為共有並且靜態:
class A{
public:
static int x;
};
由此可見:
靜態資料成員和普通資料成員一樣遵從public,protected,private訪問規則。
此時,編譯,我們會得到一個錯誤,原因就是x沒有被初始化。
所以記得給靜態成員變數初始化!
好的,我們初始化:
class A{
public:
static int x = 0;
};
編譯還是會產生錯誤,原因是這樣:
靜態成員屬於類作用域,但不屬於類物件,和普通的static變數一樣,程式一執行就分配記憶體並初始化,生命週期和程式一致。
所以,在類的建構函式裡初始化static變數顯然是不合理的。
所以,我們需要在類外,對static成員變數進行初始化:
此時要略去關鍵字static:
class A{
public:
static int x ;
};
int A::X = 0;
其實我們可以在類中對static成員變數初始化的,就是使用關鍵字const進行修飾:
class A{
public:
const static int x = 0;// ok
};
這個時候不要糾結:
static const 與const static是一樣的,沒有區別
於是你突發奇想,那既然可以使用const就可以再類中對static變數進行初始化,那麼我這麼幹:
class A{
public:
const static double x = 0;// error
};
抱歉,錯誤:
只有靜態整型常量才能在類中初始化
那按照上面的邏輯,這樣的程式碼會報錯?
class A{
public:
const static char x = '1';// error or ok?
};
想多了,上面的程式碼可以正常執行,和解?
char也是整型變數!!