1. 程式人生 > >沒有躲過的坑--類中的靜態成員變數(static or const static)

沒有躲過的坑--類中的靜態成員變數(static or const static)

工作中是這樣的,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也是整型變數!!