c++11 中 類例項的初始化問題比較複雜。 這裡涉及到例項的型別, (static vs non-static), 有沒有自定義建構函式等等。
對於static型別(全域性變數,namespace變數,類static資料成員,函式static區域性成員),class內部的成員變數都會使用預設值初始化.
//struct s1 w/o constructor
struct s1 ;
//global s1 object
s1 s1;
//s1 object in anonymous namespace
namespace
//static member of a class
struct s;
s1 s::ms;
//static local variable of a function
void f()
對於non-static型別的變數,則如果是自定義型別,會呼叫預設建構函式,對於非使用者自定義型別,則不會初始化。
void f()
int main()
對於non-static型別的變數,如果需要初始化內建型別,可以使用大括號來初始化:
void f()
; cout
} int main() ;
cout
f();
return
0;}
但是對於定義了預設建構函式的型別而言,使用空的大括號相當於呼叫了預設建構函式,如果使用者自定義的預設建構函式沒有初始化內建型別的成員變數,那麼使用大括號仍然不能初始化內建型別:
//struct s1 with default constructor
struct s1 //定義預設建構函式
};void f()
int main() ; //{}呼叫預設建構函式
cout
f();
return
0;}
實際上這只是標準對於在這些情形下如何初始化各種型別的成員變數的規定,不同的編譯器對於標準的執行會有所不一樣,比如對於以上情形,gcc編譯器的輸出結果都是『0』,而 vc++編譯器的輸出和標準也有一些出入,clang的輸出則完全符合標準的定義。 C 初始化問題
1 普通變數,const static,const static 普通變數 可以再初始化鍊錶,和建構函式中初始化 const物件 或 reference物件 只能在初始化列表中初始化 static 只能在累的外面定義和初始化 const static 如果是int 型可以在類中宣告時直接初始化,其他...
C 11 就地初始化與列表初始化
在 c 11 之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c or int b c 11 only int c 7 error 注意,小括號初始化方式不能用於就地初始化。c 11 支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,也就...
c 11 就地初始化與列表初始化
還可以看看 在c 11之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c 或int b c 11 only int c 7 error 1.2就地初始化與初始化列表的先後順序 c 11標準支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,...