1樓:du瓶邪
可以通過以下幾個例子更形象的說明這個問題:
//test.cpp
#include
class a ;
int main()
編譯以上**會出現“對‘a::a’未定義的引用”錯誤。這是因為靜態成員變數a未定義,也就是還沒有分配記憶體,顯然是不可以訪問的。
再看如下例子:
//test.cpp
#include
class a ;
int a::a = 3; //定義了靜態成員變數,同時初始化。也可以寫"int a:a;",即不給初值,同樣可以通過編譯
int main()
這樣就對了,因為給a分配了記憶體,所以可以訪問靜態成員變數a了。
因為類中的靜態成員變數僅僅是宣告,暫時不需分配記憶體,所以我們甚至可以這樣寫**:
//a.cpp
class b; //這裡我們使用前置宣告,完全不知道b是什麼樣子
class a ;
使用命令"g++ -c -o a.o a.cpp"通過編譯。
對於類來說,new一個類物件不僅會分配記憶體,同時會呼叫建構函式進行初始化,所以類物件的定義和初始化總是關聯在一起。
2樓:匿名使用者
靜態成員屬於全域性變數,是所有例項化以後的物件所共享的,而成員的初始化你可以想象成向系統申請記憶體儲存資料的過程,顯然這種共有物件必須提前申請好,而不是由某個例項化的物件來操縱的。
3樓:匿名使用者
靜態成員本質上是全域性的,類的所有物件共享,不單屬於某個物件,不能放到建構函式中初始化,簡單一點,這種初始化方式你可以認為是c++的語法規定,死記硬背就行了
4樓:溪貝0號
因為 ,你在類中初始化,不一定能夠初始化得了。(為了確保能初始化,還是寫在外面)
你在類中初始化,無非就是放在建構函式裡面。 當我們用類定義物件的時候,肯定要呼叫建構函式,它也就順便初始化話了。
但是,你人算不如天算,若有人故意找事,偏不用類呼叫物件,而是通過 類名::靜態變數 的方式 訪問靜態變數,這時你就訪問到了一個未初始化的變數,這是編譯器所不允許的。
所以,由於類內不能完全初始化,所以還是類外初始化可靠,確保了初始化。
其實初始化雖然寫在類外,其實他是屬於類內的。
不然你初始化話私有的靜態變數就訪問不到,所以其實你說的類外,其實就是類內,只是寫在了類外而已。
c語言中實型資料運算的問題如圖,C語言中實型資料運算的問題! 如圖 a 1 0 3 3 b 3 2 c 1 3 3 為什麼產生這樣的結果
個人認為如此 a 1.0 3 3 1.0是浮點數,而3是整形數,所以對3進行隱式轉換到浮點型,得出的結果與3的浮點型數相乘,得1.0 b 3 2 3和2都是整形,所以相除得1,餘1,而得出的整形結果是1,放進浮點型的結果裡,所以是1.0 c 1 3 3 1和3都是整形,所以相除得0,而0 3 0,所...
c語言中如何使用檔案中的資料變數
使用fopen,fscanf函式可以實現從txt檔案當中讀取內容,進行簡單操作。1.fopen的函式原型 file fopen const char path,const char mode fopen函式的第乙個引數是檔案路徑,第二個引數是開啟方式,有以下幾種方式 r 以唯讀方式開啟檔案,該檔案必...
c語言中c與s的區別,c語言中 c與 s的有什麼區別?
mxx米小夕 c語言中 c格式符表示輸出的是字元 s格式符表示輸出的是字串。c語言基本構成 1.資料型別 c的資料型別包括 整型 字元型 實型或浮點型 單精度和雙精度 列舉型別 陣列型別 結構體型別 共用體型別 指標型別和空型別。2.常量與變數 常量其值不可改變,符號常量名通常用大寫。變數是以某識別...