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 constantconst int size = i; // fine!
int arr[size]; // error!
然而對於constexpr,則表明這個值不僅是constant的,而且也是編譯期確定的,於是,constexpr修飾的是可以用於陣列大小的。
int i; // not constantconstexpr 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 正確,雖然...