C 11中類資料成員初始化方法詳解

2021-07-25 17:57:04 字數 1484 閱讀 9559

c++98為類中提供類成員的初始化列表。

類物件的構造順序是這樣的:1.分配記憶體,呼叫建構函式時,隱式/顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算

1.類裡面的任何成員變數在定義時是不能初始化的。

2.一般的資料成員可以在建構函式中初始化。

3.const資料成員必須在建構函式的初始化列表中初始化。

4.static要在類的定義外面初始化。   

5.陣列成員是不能在初始化列表裡初始化的。

6.不能給陣列指定明顯的初始化。  

這6條一起,說明了乙個問題:c++裡面是不能定義常量陣列的!因為3和5的矛盾。這個事情似乎說不過去啊?沒有辦法,我只好轉而求助於靜態資料成員或者使用列舉。

但是在c++11中,我們可以利用類內初始化:

int j = 15;

class

bclass

;int &b=j;

int &k = f;

static

int c;

static

const

int d=30;

static

const

float e;static

const

int d=30;

static

constexpr

float g=9.5f;static

constexpr

float int m[3]=;

public:bclass();       注釋去掉有錯誤

//thesecondarray[20] = ;}void print()};int

bclass::c = 20;const

float

bclass::e = 40.0;

可以看到基本型別不用多說,可以在類內初始化。在這裡我們重點看const 與static,引用,以及陣列。const  的int 與float都能在類內初始化。但是static還是只有static const int 能在類內初始化,其他的static 還是能在類外初始化。而引用則可以在類內初始化。而無論是const 陣列還是非const 陣列,都不能在類內顯示初始化。其中 int m[3] 為整型陣列資料成員, 所以應該用constexpr表示式。關於constexpr和const的區別如下:

const是表明這個值是constant的,但是不必在編譯期確定,然而陣列的大小是需要在編譯期確定的,如:

int i; // not constant

const int size = i; // fine!

int arr[size]; // error!

然而對於constexpr,則表明這個值不僅是constant的,而且也是編譯期確定的,於是,constexpr修飾的是可以用於陣列大小的。

int i; // not constant

constexpr int size = i; // error!

C 11類成員的初始化總結

以前看到的c 98的文章 c 為類中提供類成員的初始化列表。類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算 1.類裡面的任何成員變數在定義時是不能初始化的。2.一般的資料成員可以在建構函式中初始化。3.const資料...

c 11 以類內成員函式初始化執行緒

更新,忘記當時寫的具體是啥了 大概就是下面這個意思 今天敲了這樣一段 簡化版本 include include include using namespace std class t void func int main 我在 1 的部分得到報錯 error invalid use of non s...

C 11 變數初始化方法彙總

初始化 建立變數時賦予其乙個初始值。賦值 把物件 已經建立 的當前值擦除,而用乙個新值來代替。int a 列表初始化方式1 int a 列表初始化方式2說明 上述的兩種方式都可以將變數a初始化為0。當對內建型別使用列表初始化時,若初始值存在丟失的風險,編譯將報錯,如 int a 3.14 正確,雖然...