您的位置:首页 > 编程语言 > C语言/C++

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

2013-07-22 11:12 465 查看
注:本系列笔记所有内容的参考资料来源于《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;


}

Output:

[b]1 2 3 4 5[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: