在c++11以前,程式設計師,或者初學者經常會感到疑惑關於怎樣去初始化乙個變數或者是乙個物件。
初始化經常使用括號,或者是使用大括號,或者是復賦值操作。
因為這個原因,c++11提出了統一初始化,以為著使用這初始化列表,下面的做法都是正確的。
int value ;
std::vectorvi ;
std::vectorcities ;
std::complexc; //相當於c(4.0 , 3.0);
乙個初始化列表強制使用賦值操作, 也就是以為著每個變數都是乙個預設的初始化值,被初始化為0(null 或者是 nullptr)
如下:int i; //這是乙個未定義的行為
int i{}; //i呼叫預設的建構函式為i賦值為0
int *p; //這是乙個未定義的行為
int *p{} ;// p被初始化為乙個nullptr
然後,精確的初始化,它們減少精度,或者是乙個補充值被修改,是不可能的。
例如:int x1(5.3); // 5
int x2 = 5.3 //5
int xi //精確地 所以會出現error
int x4 = // 精確地 所以會出現error
char ci;
char c9; //error 9999不合適是乙個char型別
正如你所看見的,去檢查是否是精確地,儘管變數或許是被認定的, 如果變數發生在編譯時期。
為了支援初始化列表和使用者自定義型別結合,c++11提供了類模板class templete std::initialize_list<> , 可以被用來初始化乙個值或者在任何地方你想提供一組值。
void print(std::initialize_listvals)
for(auto p= vals.begin() ; p != vals.end() , ++p )
std::cout<<*p<
print(2 , 3, 4, 5,6 , 7);
作為程式的輸出
當建構函式為乙個特殊的成員或者是乙個初始化列表,初始化列表是被作為首選的
class p
public:
p(int , int);
p(std::initialize_liat);
p p(77,5); //call p(int , int);
p p ;
//call p(std::initialize_liat);
p r; //call p(std::initialize_liat);
p s = ; //call p(std::initialize_liat);
沒有建構函式的初始化列表,建構函式傳遞兩個整形通過p,q兩個形參。
因為初始化列表,explicit顯示構造變成實質性的,所以現在你可以通過乙個自動型別對多個值操作, 當乙個初始化列表使用=語法。
class p
explicit p(int a , int b , int c)
};p x; //ok
p z; //ok
p v = ; //ok
p k = ; // 因為顯式呼叫標記
void fp(const p&);
fp(); //ok
fp() ; //error 因為顯式呼叫標記
fp(p); //ok
fp(p); //ok
相同的方法,顯式構造使用乙個初始化列表是無力的內含的0 , 1 , 或者更多的初始化值
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標準支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,...
C 統一初始化語法(列表初始化)
不格 要是世上不曾存在c 14和c 17該有多好!constexpr是好東西,但是讓編譯器開發者痛不欲生 新標準庫的確好用,但改語法細節未必是明智之舉,尤其是3年一次的頻繁改動。c 帶了太多歷史包袱,我們都是為之買賬的一員。我沒那麼多精力考慮c 14 17的問題,所以本文基於c 11標準。知其所以然...