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提供了類內初始化的方式,更霸道和方便!