1. 程式人生 > >C++11特性--統一的初始化,std::initializer_list

C++11特性--統一的初始化,std::initializer_list

        注:本系列筆記所有內容的參考資料來源於《C++ Primer Plus》
            C++11特性需編譯器支援,如果是WindowS整合開發環境,一般需要在IDE的編譯器選項裡找或者工程的屬性裡可以配置"-std=c++11"

            以devC++為例:project==>project options==>Parameters==>
                                          



1.統一的初始化
  *C++11擴大了初始化列表的適用範圍,使其可用於所有內建型別和使用者定義的型別。使用初始化列表時,可新增=,也可不新增
   Example:
      class A
{
   public:
   A(int i,int j):x(i),y(j)
   {
   }
   
   void fun()
   {
   cout<<x<<ends<<y<<endl;
   }
  private:
  int x;
  int y;
};


 int main()
 {
 
 
 int x{1};
 int y = {2};
 int arr[]{1,2,3};
 A a{1,2};
 cout<<"x: "<<x<<endl;
 cout<<"y: "<<y<<endl;
 cout<<"int arr:"<<endl;
 for(int i=0;i<3;i++)
 {
 cout<<"arr["<<i<<"]: "<<arr[i]<<ends;
 }
 cout<<endl;
 cout<<"a :";
 a.fun();

return 0;
 }


 執行結果
   




2.初始化列表語法的好處
   *防止縮窄,即禁止將數值賦給無法儲存它的數值變數,但允許更寬型別的轉換
    Example:
    int main()
 {
 
 
   char c=200;
//no warning
   char c1{200};//Warning, narrowing conversion of '200' from 'int' to 'char' inside { } 
   double d{200};//ok    
return 0;
 }
  
 3.std::initializer_list
  STL容器提供了將initializer_list作為引數的建構函式
  Example:
     int main()
 {
 vector<int> vec{1,2,3,4};
 for(int x:vec)
 {
 cout<<x<<ends;
//1 2 3 4
}

       return 0;
 }
  
  Tips:intializer_list還可以用作常規函式引數,此時需包含標頭檔案(#include<initializer_list>)
       這個模板類包含成員begin()和end(),可用於獲悉列表的範圍
  Example:
     void fun(initializer_list<int> il)
{
for(auto p=il.begin();p!=il.end();p++)
{
cout<<*p<<ends;
}
}


 int main()
 {
 
 fun({1,2,3,4,5});
           
return 0;