from http://blog.csdn.net/foreverhuylee/article/details/45132499 c++中靜態(tài)成員變量要在類外部再定義,否則產(chǎn)生link2001錯(cuò)誤.class testClass { public: static int m_i; }; // 類外部定義,,若不寫會(huì)產(chǎn)生 // 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[]) { printf("%d\n",testClass::m_i); printf("\n"); return 0; } 為什么要在類的外部進(jìn)行定義的原因: 1. 在類中,只是聲明了靜態(tài)變量,,并沒有定義,。 2. 聲明只是表明了變量的數(shù)據(jù)類型和屬性,并不分配內(nèi)存,;定義則是需要分配內(nèi)存的,。 注意:如果在類里面這么寫int a; 那么是既聲明了變量,,也定義了變量,兩者合在一起了,。 3. 靜態(tài)成員是“類級(jí)別”的,,也就是它和類的地位等同,而普通成員是“對(duì)象(實(shí)例)級(jí)別”的,。 類級(jí)別的成員,,先于該類任何對(duì)象的存在而存在,它被該類所有的對(duì)象共享,。 4. 現(xiàn)在,,咱們假定要實(shí)例化該類的一個(gè)對(duì)象,那么會(huì)發(fā)生什么事情呢,? 靜態(tài)成員肯定要出現(xiàn)在這個(gè)對(duì)象里面的,,對(duì)吧?這時(shí)候才去定義那個(gè)靜態(tài)成員嗎,?這顯然是不合適的,。 因?yàn)椋热缬辛硗庖粋€(gè)線程也要?jiǎng)?chuàng)建該類的對(duì)象,,那么也要按照這個(gè)方式去定義那個(gè)靜態(tài)成員,。 這會(huì)產(chǎn)生兩種可能的情況: A. 重復(fù)定義; B. 就算不產(chǎn)生重復(fù)定義的情況,,也會(huì)產(chǎn)生競(jìng)爭(zhēng),,從而造成死鎖的問題,以至于對(duì)象無(wú)法創(chuàng)建,。 很顯然,,編譯器不能這么干。那么很合理的解決辦法,,就是事先在類的外部把它定義好,,然后再供所有的對(duì)象共享。 當(dāng)然這樣做,,還是有可能產(chǎn)生線程安全的問題,,但不管怎么說(shuō)對(duì)象是創(chuàng)建好了,而這種線程安全問題,,可以在編程中予以解決,。 對(duì)于class的static data member,其實(shí)只是聲明了一個(gè)scope(還記得class::static_data_member中的::么,?),, 既然是聲明而已,所以還需要一個(gè)定義, 之所以需要在類的外面,,因?yàn)楸举|(zhì)來(lái)說(shuō)它和global和static變量沒什么區(qū)別,,都是在數(shù)據(jù)段的,只是scope不一樣,,屬于class而已,。 這里反映出了C/C++里面一些稍微偏底層的復(fù)雜的細(xì)微的概念,比如scope,,storage,,life time。 ::是指scope,,是在class里面聲明的,, static指storage,是和global一樣,,在外面定義的,。 |
|
來(lái)自: 心不留意外塵 > 《ccpp for hardware》