
C++11为变量和对象支持了更为丰富的通过花括号列表进行初始化:
#include
using namespace std;
int main(){
int i1 = 1; //等号赋值表达式初始化
int i2(2); //类似构造的圆括号表达式
int i3 = (3); //等号赋值表达式初始化
int i4{4}; //列表初始化
int i5 = {5}; //列表初始化
int a[]{1, 2, 3}; //列表初始化
int b[] = {4, 5, 6}; //列表初始化
vector d{7, 8, 9}; //列表初始化
vector e = {10, 11, 12}; //列表初始化
return 0;
}
这种使用了花括号列表进行初始化的方式,对于自定义的类也可以实现:
#include
#include
#include
using namespace std;
class Data{
public:
Data(initializer_list l) //自定义类的列表初始化构造函数
{
for(initializer_list::iterator it = l.begin(); it < l.end(); ++it)
{
m_array.push_back(*it); //通过迭代列表,初始化对象
}
}
void pData()
{
cout<<"data list:";
for(vector::iterator it = m_array.begin(); it < m_array.end(); ++it)
{
cout<<*it<<" ";
}
cout< m_array;
};
int main(){
Data d1 = {1, 2, 3};
d1.pData();
Data d2{4, 5, 6};
d2.pData();
return 0;
}
运行程序输出:
data list:1 2 3
data list:4 5 6
对于花括号列表初始化,C++11有一个提升,就是会要求编译器做类型匹配的检查:
int main(){
char a{255}; //编译报错,char的数值范围是-128~+127,255不在合法的数值范围内
unsigned char b = {-1}; //编译报错,unsigned char的数值范围是0~255,-1不在合法的数值范围内
char c{1.1}; //编译报错,1.1是浮点数值,不在c的合法数值范围内
float d = {1e48}; //编译报错,1e48是dobule数值,不在float的合法数值内
return 0;
}
可见通过这种方式,可以强制编译器做出类型收窄的检查。
有利于在第一时间发现类型匹配的错误。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)