靜態成員屬於全局變量,是所有實例化以后的對象所共享的,而成員的初始化你可以想象成向系統申請內存存儲數據的過程,顯然這種共有對象必須提前申請好,而不是由某個實例化的對象來操縱的。
#include <stdio.h>
class A {
public:
static int a; //聲明但未定義
};
int main() {
printf("%d", A::a);
return 0;
}
編譯以上代碼會出現“對‘A::a’未定義的引用”錯誤。這是因為靜態成員變量a未定義,也就是還沒有分配內存,顯然是不可以訪問的。
再看如下例子:
//test.cpp
#include <stdio.h>
class A {
public:
static int a; //聲明但未定義
};
int A::a = 3; //定義了靜態成員變量,同時初始化。也可以寫"int A:a;",即不給初值,同樣可以通過編譯
int main() {
printf("%d", A::a);
return 0;
}
這樣就對了,因為給a分配了內存,所以可以訪問靜態成員變量a了。
因為類中的靜態成員變量僅僅是聲明,暫時不需分配內存,所以我們甚至可以這樣寫代碼:
//a.cpp
class B; //這里我們使用前置聲明,完全不知道B是什么樣子
class A {
public:
static B bb;//聲明了一個類型為B的靜態成員,在這里編譯器並未給bb分配內存。
//因為僅僅是聲明bb,所以編譯器並不需要知道B是什么樣子以及要給其對應的對象分配多大的空間。
//所以使用前置聲明"class B"就可以保證編譯通過。
};
