C 類的靜態成員變數初始化

2021-10-10 01:21:00 字數 803 閱讀 8925

今天寫**時用了下c++中的靜態成員變數,發現了乙個以前不注意的現象,特此記錄下。有類如下:

class

audioplay

;audioplay::

audioplay()

audioplay::

~audioplay()

audioplay* audioplay::

get(

)

以上**編譯通過,但是鏈結時說無法解析這個靜態變數a。這讓我很不理解,a明明是類中的靜態成員變數,為什麼會無法解析呢?如果說是一般的成員變數還可以理解,而這裡a是靜態成員變數,不應該啊!?

audioplay* audioplay::

get(

)

難道是訪問a必須要加入類名作用域符?於是我又按上面這樣進行編譯,還是老問題。

int audioplay::a =0;

audioplay* audioplay::

get(

)

後來發現,必須要在類外先定義一下才行,如上。

其實,類外的「int audioplay::a = 0;」這一行才是真正的定義,類中的「static int a;」只是宣告了一下,所以會無法解析。

除了這種方式,在類內用const修飾符進行修飾的話,就可以免去類外的定義了,如下,但是這樣a就不能變化了。

class

audioplay

;

此外,也可以用內聯來取代外部定義,但是需要c++17支援。

C 靜態成員變數的初始化

需要注意的是 靜態資料成員不能在類中初始化,一般在類外和main 函式之前初始化,預設時初始化為0。1.static成員的所有者是類本身,但是多個物件擁有一樣的靜態成員。從而在定義物件是不能通過建構函式對其進行初始化。2.靜態成員不能在類定義裡邊初始化,只能在class body外初始化。3.靜態成...

c 類的成員變數初始化

最近在做乙個關於boost的專案,修改將原本的多個commandline進行合併精簡,合併成乙個path路徑,然後再加上不同的hardcode的檔名組成乙個完整的路徑。由於在使用ptree時會呼叫靜態方法建立乙個instance的類,因此這裡需要使用靜態成員變數。大概整理了一下以前沒有注意過的類的成...

類成員變數初始化

在 c 中,類的成員變數未初始化問題,取決於物件建立方式,不同的建立方式,直接導致類成員變數的初值不同。本文通過下例,得出一下結論 1.在函式體內置立乙個物件,類成員變數和普通的區域性變數一樣,是乙個隨機值。2.建立乙個全域性成員物件,類成員變數和全域性變數一樣,編譯器賦值為 0。3.在函式體內 n...