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


C++中靜態成員變量要在類外部再定義或初始化,否則會產生錯誤。

class A
{
public:
	static int a;
};
int A::a=0;

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

1. 在類中,只是聲明了靜態變量,並沒有定義。

2. 聲明只是表明了變量的數據類型和屬性,並不分配內存;定義則是需要分配內存的。    注意:如果在類里面這么寫int a; 那么是既聲明了變量,也定義了變量,兩者合在一起了。

3. 靜態成員是“類級別”的,也就是它和類的地位等同,而普通成員是“對象(實例)級別”的。    類級別的成員,先於該類任何對象的存在而存在,它被該類所有的對象共享。

4. 現在,咱們假定要實例化該類的一個對象,那么會發生什么事情呢?  

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

 因為,比如有另外一個線程也要創建該類的對象,那么也要按照這個方式去定義那個靜態成員。  

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

  A. 重復定義;      

B. 就算不產生重復定義的情況,也會產生競爭,從而造成死鎖的問題,以至於對象無法創建。          

很顯然,編譯器不能這么干。那么很合理的解決辦法,就是事先在類的外部把它定義好,然后再供所有的對象共享。          

當然這樣做,還是有可能產生線程安全的問題,但不管怎么說對象是創建好了,而這種線程安全問題,可以在編程中予以解決。

既然statci成員變量在類中只是聲明那么就需要在類外部重新定義或者初始化


免責聲明!

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



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