有些成員變數的資料型別比較特別,它們的初始化方式也和普通資料型別的成員變數有所不同。這些特殊的型別的成員變數包括:
a. 常量型成員變數 b.
引用型成員變數 c.
靜態成員變數
d. 整型靜態常量成員變數
e. 非整型靜態常量成員變數
對於常量型及引用型成員變數,由於這兩種型別不支援賦值操作,因此必須通過建構函式初始化列表來初始化。
對於靜態成員變數,在類定義時我們其實是在宣告而不是定義這些靜態變數(如果是非靜態變數,則我們既是在宣告又是在定義變數),因此,靜態成員變數的初始化要放在類外進行。又由於標頭檔案可以被多個原始檔包含,為避免重複定義,靜態成員變數的初始化應該放在原始檔中。
整形靜態常量成員變數是個特例,可以按一般的靜態成員變數一樣處理,在類中宣告,類外初始化;也可以直接在類內初始化(編譯器會自動優化掉此變數??)。
測試原始碼:
test.h
#ifndef _test_h_
#define _test_h_
class ctest
;private:
double d;
const double cd; // 常量成員需採用建構函式的初始化列表初始化,參見建構函式
const double &rcd; // 引用成員需採用建構函式的初始化列表初始化,參見建構函式
static double sd; // 此處宣告靜態成員變數,需要在外部(推薦在原始檔中)定義
static int si0; // 同上
static const int sc = 10; // 整形靜態常量成員,可以在此處初始化,此時既是定義又是宣告,外部不能再定義
static const double scd; // 非整形靜態常量成員,需在外部(推薦在原始檔)定義和初始化
};#endif
test.cpp:
#include "test.h"
double ctest::sd; // 靜態成員變數定義,若未初始化,則值預設為0
int ctest::si0;
const double ctest::scd = 100; // 靜態常量成員變數定義,且常量必須指定初始化值
//const int ctest::sc; // 此處不能再定義,多個原始檔包含test.h時會出錯(vs2013)
ctest::ctest(const double cd, double id) :cd(1.0), rcd(cd)
int main()
類成員變數初始化
在 c 中,類的成員變數未初始化問題,取決於物件建立方式,不同的建立方式,直接導致類成員變數的初值不同。本文通過下例,得出一下結論 1.在函式體內置立乙個物件,類成員變數和普通的區域性變數一樣,是乙個隨機值。2.建立乙個全域性成員物件,類成員變數和全域性變數一樣,編譯器賦值為 0。3.在函式體內 n...
類的幾種特殊的成員變數的初始化
有些成員變數的資料型別比較特別,它們的初始化方式也和普通資料型別的成員變數有所不同。這些特殊的型別的成員變數包括 a.引用 b.常量 c.靜態 d.靜態常量 整型 e.靜態常量 非整型 常量和引用,必須通過引數列表進行初始化。靜態成員變數的初始化也頗有點特別,是在類外初始化且一定不能再帶有 stat...
C 類中成員變數初始化
c 類中成員變數包括主要四種 普通成員變數,常量成員變數,靜態成員變數,靜態常量成員變數 上述成員變數該如何初始化,注意不是賦值。由於普通成員變數和常量成員變數,每乙個類例項化,都乙份記憶體拷貝。c 規定成員變數在宣告 注意宣告與定義區別 時,不允許初始化,因此這些變數只能放在建構函式初始化列表中。...