為什么static數據成員一定要在類外初始化?(轉)


1.避免重復定義和初始化

<<c++ primer>>說在類外定義和初始化是保證static成員變量只被定義一次的好方法。

但,為什么static const int就可以在類里面初始化呢?

想起C中一個函數里定義一個static變量是為了保證只初始化一次。

那么,是否可以這樣理解:

static數據成員在類外定義和初始化是為了保證只被定義和初始化一次,這樣編譯器就不必考慮類的函數里面第一個對static變量的’=’操作是賦值還是初始化了。

static const int可以在類里面初始化,是因為它既然是const的,那程序就不會再去試圖初始化了。

 

而且,<<c++ primer>>說static const int也必須在類外定義,類里面的只是聲明和初始化(但是linux下用GCC試的結果是

:不用在類外定義也完全可以,gcc version 3.4.6)。

 

2.滿足C++的static語意

這里的語意,應該就是1中說的意思了吧

 

只有const沒有static的話,類的每個object都有這個const變量,也不能在類的數據成員聲明的時候一起初始化了,只能在構造函數的初始化列表里初始化。

 

//下面是網上看到的內容:

+++++++++++++++++++++++++

#include   <iostream.h> 

class   CDummy 

public: 
        static   int   n; //這里只是聲明
}; 

int   CDummy::n=9; //這里是定義加初始化

void   main() 

        cout < <CDummy::n < <endl; 


上面這樣完全沒問題,但是不能直接在類中初始化,比如: 

static   int   n=9; 

+++++++++++++++++++

 

 

為什么static成員一定要在類外初始化? 

        這是因為被static聲明的類靜態數據成員,其實體遠在main()函數開始之前就已經在全局數據段中誕生了(見《Inside   The   C++   Object   Model》page247)!其生命期和類對象是異步的,(而且靜態語意說明即使沒有類實體的存在,其靜態數據成員的實體也是存的)這個時候對象的生命期還沒有開始,如果你要到類中去初始化類靜態數據成員,讓靜態數據成員的初始化依賴於類的實體,,那怎么滿足前述靜態語意呢?難道類永遠不被實例化,我們就永遠不能訪問到被初始化的靜態數據成員嗎? 

            所以我的朋友,為了滿足C++的static語意,static成員一定要在類外初始化!


免責聲明!

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



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