c 中靜態成員變數要在類外部再定義或初始化的原因

2021-08-09 06:15:01 字數 1249 閱讀 3716

c++中靜態成員變數要在類外部再定義,否則產生link2001錯誤.

class testclass

;

// 類外部定義,若不寫會產生

// error lnk2001: unresolved external symbol "public: static int testclass::m_i" (?m_i@testclass@@2ha)

int testclass::m_i;

int main(int argc, char* argv)

為什麼要在類的外部進行定義的原因:

1. 在類中,只是宣告了靜態變數,並沒有定義。

2. 宣告只是表明了變數的資料型別和屬性,並不分配記憶體;定義則是需要分配記憶體的。

注意:如果在類裡面這麼寫int a; 那麼是既宣告了變數,也定義了變數,兩者合在一起了。

3. 靜態成員是「類級別」的,也就是它和類的地位等同,而普通成員是「物件(例項)級別」的。

類級別的成員,先於該類任何物件的存在而存在,它被該類所有的物件共享。

4. 現在,咱們假定要例項化該類的乙個物件,那麼會發生什麼事情呢?

靜態成員肯定要出現在這個物件裡面的,對吧?這時候才去定義那個靜態成員嗎?這顯然是不合適的。

因為,比如有另外乙個執行緒也要建立該類的物件,那麼也要按照這個方式去定義那個靜態成員。

這會產生兩種可能的情況:

a. 重複定義;

b. 就算不產生重複定義的情況,也會產生競爭,從而造成死鎖的問題,以至於物件無法建立。

很顯然,編譯器不能這麼幹。那麼很合理的解決辦法,就是事先在類的外部把它定義好,然後再供所有的物件共享。

當然這樣做,還是有可能產生執行緒安全的問題,但不管怎麼說物件是建立好了,而這種執行緒安全問題,可以在程式設計中予以解決。

對於class的static data member,其實只是宣告了乙個scope(還記得class::static_data_member中的::麼?),

既然是宣告而已,所以還需要乙個定義,

之所以需要在類的外面,因為本質來說它和global和static變數沒什麼區別,都是在資料段的,只是scope不一樣,屬於class而已。

這裡反映出了c/c++裡面一些稍微偏底層的複雜的細微的概念,比如scope,storage,life time。

::是指scope,是在class裡面宣告的,

static指storage,是和global一樣,在外面定義的。

C 中靜態成員變數要在類外部再定義或初始化的原因

c 中靜態成員變數要在類外部再定義或初始化,否則會產生錯誤。class a int a a 0 為什麼要在類的外部進行定義的原因 1.在類中,只是宣告了靜態變數,並沒有定義。2.宣告只是表明了變數的資料型別和屬性,並不分配記憶體 定義則是需要分配記憶體的。注意 如果在類裡面這麼寫int a 那麼是既...

靜態成員變數 類 C

if 0 如何訪問靜態成員 四種用法 1 rectangle printtotal 2 rectangle r r.printtotal 3 rectangle p r p printtotal 4 rectangle ref r int n ref.ntotalnumber p printtota...

C 靜態成員變數為什麼在類外部定義?

c 中靜態成員變數要在類外部再定義,否則產生link2001錯誤.class testclass 類外部定義,若不寫會產生 error lnk2001 unresolved external symbol public static int testclass m i m i testclass 2...