工作中是這樣的,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也是整型變量!!**
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- string中的c_str()陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常