C++類的靜態成員變數初始化

taotaost發表於2020-10-06

今天寫程式碼時用了下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支援。

相關文章