c++語言中類中的靜態數據成員為什么必須在類體外初始化?


靜態成員屬於全局變量,是所有實例化以后的對象所共享的,而成員的初始化你可以想象成向系統申請內存存儲數據的過程,顯然這種共有對象必須提前申請好,而不是由某個實例化的對象來操縱的。

 

 

#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"就可以保證編譯通過。
};

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM