c 語言中類中的靜態資料成員為什麼必須在類體外初始化

2021-07-04 07:40:53 字數 1210 閱讀 5167

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語言不同資料型別間的混合運算

再回來說下,你可以這樣進行檢測,看隱式轉換的問題還是溢位的問題 typedef unsigned long long uint64 最新的編譯器都支援這種用法吧,總之你找個能表示64位的longlong就行了.uint cout uint64 iu uint i endl 這裡先將i轉換成uint型...

c語言中,常量中的整型與實型,在C語言中的整型變數與實型變數的區別是什麼?

不是一樣的概念啊 數學裡面的實數包括有理數和無理數。其中無理數就是無限不迴圈小數,有理數就包括整數和分數。數學裡的整數與實數只是簡單的數值型別的一種包含與被包含的關係。而在c語言中就不止這些了 他不僅僅是數值型別的區別,更主要的是這兩種在計算機中的儲存結構不同,占得位元組數不同,一般系統整型資料佔2...

C 運算子過載中過載為類的成員函式和過載為類的友元函式

友元函式 bai 具有與du類成員函式相同訪問zhi權利的 非dao成員函式 他可以訪問類專的私有和保護成員屬 通過該類物件 物件指標或其引用。簡單且一般的說 運算子過載為類的成員函式,他的引數個數會比 該運算子的操作符 少一,而運算子過載為友元函式時,他的引數與其操作個數是相同的。友員函式是指來在...