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++
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 類內的靜態成員函式函式
- C++ 靜態變數什麼時候完成初始化C++變數
- 12-成員變數的初始化變數
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- oop類的繼承與類靜態成員學習OOP繼承
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- Java初始化靜態變數的時間順序Java變數
- 區域性靜態變數的初始化觀測變數
- c#物件導向- 靜態成員和非靜態成員的區別C#物件
- C#快速入門教程(3)——類的靜態成員和例項成員C#
- 子父類中成員變數變數
- C++類內成員變數可以定義引用型別嗎C++變數型別
- Python中類變數、成員變數、區域性變數的區別Python變數
- TypeScript 中 class 的例項成員與靜態成員TypeScript
- 靜態變數變數
- c++語言中類的私有型別或保護型別成員變數C++型別變數
- C++:類的成員函式C++函式
- 成員變數變數
- ConcurrentHashMap(一):常量,成員變數,靜態程式碼塊,內部類,spread函式,tabAt函式等詳解HashMap變數函式BAT
- 對於靜態成員來說是類的建構函式,對於例項成員是類的原型物件。函式原型物件
- C++ 類成員函式C++函式
- C++ 類成員指標C++指標
- 類,物件,成員變數和區域性變數,匿名物件物件變數
- C++共享之道:用extern實現原始檔變數與類成員函式的巧妙共享C++變數函式
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- Java 反射修改類的常量值、靜態變數值、屬性值Java反射變數