C++類的靜態成員變數初始化
今天寫程式碼時用了下C++中的靜態成員變數,發現了一個以前不注意的現象,特此記錄下。有類如下:
class AudioPlay
{
public:
static AudioPlay* get();
static int a;
virtual ~AudioPlay();
private:
AudioPlay();
};
AudioPlay::AudioPlay(){
}
AudioPlay::~AudioPlay(){
}
AudioPlay* AudioPlay::get() {
static AudioPlay ap;
a = 3;
return ≈
}
以上程式碼編譯通過,但是連結時說無法解析這個靜態變數a。這讓我很不理解,a明明是類中的靜態成員變數,為什麼會無法解析呢?如果說是一般的成員變數還可以理解,而這裡a是靜態成員變數,不應該啊!?
AudioPlay* AudioPlay::get() {
static AudioPlay ap;
AudioPlay::a = 3;
return ≈
}
難道是訪問a必須要加入類名作用域符?於是我又按上面這樣進行編譯,還是老問題。
int AudioPlay::a = 0;
AudioPlay* AudioPlay::get() {
static AudioPlay ap;
a = 3;
return ≈
}
後來發現,必須要在類外先定義一下才行,如上。
其實,類外的“int AudioPlay::a = 0;”這一行才是真正的定義,類中的“static int a;”只是宣告瞭一下,所以會無法解析。
除了這種方式,在類內用const修飾符進行修飾的話,就可以免去類外的定義了,如下,但是這樣a就不能變化了。
class AudioPlay
{
public:
static AudioPlay* get();
static const int a;
virtual ~AudioPlay();
private:
AudioPlay();
};
此外,也可以用內聯來取代外部定義,但是需要C++17支援。
相關文章
- c++類的靜態成員C++
- C++:類的靜態成員C++
- C++ 類的靜態成員C++
- C++類靜態成員C++
- C++類中的常成員和靜態成員C++
- 類成員變數的初始化變數
- c++成員變數初始化C++變數
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- 類的靜態成員變數和普通成員變數該怎樣去區別定義變數
- C++ 的靜態成員變數為什麼一定要在類外定義C++變數
- Java的靜態成員類Java
- 類的成員變數的初始化順序變數
- c++中的靜態成員C++
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 獨一無二----靜態成員變數 (轉)變數
- C++ 靜態資料成員C++
- 類內的靜態成員函式函式
- 探討Java類中成員變數的初始化方式Java變數
- C++ 靜態變數什麼時候完成初始化C++變數
- 12-成員變數的初始化變數
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- 靜態資料成員和靜態成員函式函式
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- Python的靜態方法和類成員方法Python
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- oop類的繼承與類靜態成員學習OOP繼承
- C/C++ 靜態變數解析C++變數
- C/C++返回內部靜態成員的陷阱薦C++
- 靜態變數和非靜態變數變數
- 子父類中成員變數變數
- c# 用反射獲得靜態類成員C#反射
- c#物件導向- 靜態成員和非靜態成員的區別C#物件
- C#快速入門教程(3)——類的靜態成員和例項成員C#
- Java初始化靜態變數的時間順序Java變數
- 區域性靜態變數的初始化觀測變數
- 使用類繼承還是類的成員變數繼承變數
- C++類內成員變數可以定義引用型別嗎C++變數型別
- C++ static variable(靜態變數) 學習C++變數