C++中的const,static const和static類成員的初始化問題

C++中, const, static const, static這三種類成員的初始化容易出問題:

const 作爲類成員,只能在構造函數初始化列表中被初始化(C++98);

(C++11提供了類內初始化,因此內類常量可在聲明類時進行類內初始化,因此該類內常量的作用域屬於類級,即該類的所有對象均具有同一個值。)

static 作爲類成員,所有類對象共享該成員,只能類外部的.cpp文件中被初始化,初始化時不用指明static屬性

static const 作爲類成員,爲const成員作爲所有類共享的數據在類內初始化提供了可能,聲明該變量是時必須在類內對其初始化

如果要取static const 成員變量地址,則必須對其變量進”類外定義“(該定義不指定值,容易誤解爲聲明),因爲編譯器要求,如果要對內類const進行取地址,必須提供定義式。


const作爲類成員爲什麼只能在初始化列表中被初始化呢?

構造函數創建對象時,對象在執行構造函數函數體前(即大括號之前)被創建(即分配存儲空間)。因此,調用構造函數將爲對象的成員變量分配內存。然後程序流程進入到構造函數函數體(大括號中的代碼),使用常規的賦值方式對成員變量進行賦值。因此,對於const數據成員,必須在執行到構造函數體之前,即創建對象(即爲const變量分配內存時),進行初始化。因此,const成員不能通過普通的構造函數來初始化。C++提供了一種特殊的語法完成上述工作——成員初始化列表,在構造函數函數體之前加入列表,將成員初始化,很好的解決了const成員初始化的問題。


C++初始化列表注意事項:

這種格式只能用於構造函數;

必須用這種格式初始化非靜態const數據成員(c++11之前,因爲c++11之後提供 類內初始化)

必須用這種格式初始化引用數據成員,因爲引用變量必須要求在創建時就被初始化(這點跟const變量很相似)


數據成員被初始化的順序是什麼樣呢?

與類聲明中的順序相同,與初始化器重的順序無關。


C++11提供了類內初始化的方式,更霸道和方便!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章