類中特殊成員變數的初始化

2021-06-27 13:23:05 字數 1345 閱讀 1645

有些成員變數的資料型別比較特別,它們的初始化方式也和普通資料型別的成員變數有所不同。這些特殊的型別的成員變數包括:

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 規定成員變數在宣告 注意宣告與定義區別 時,不允許初始化,因此這些變數只能放在建構函式初始化列表中。...