本文主要介绍C 11系列学习的列表初始化。标准的初始化方法太复杂,限制太多。所以新标准中统一了初始化方。为了使初始化有明确的效果,提出了列表初始化的概念。下面我们一起来学习详细的介绍。
目录
前言:旧标准初始化模式技术细节总结C 11标准初始化模式初始化列表
前言:
因为旧标准初始化方法太复杂,限制太多,所以在新标准中统一了。为了使初始化有明确的效果,提出了列表初始化的概念。
旧标准初始化方式
普通数组初始化:
int i_arr[3]={1,2,3}
POD类型初始化(即plain old data类型,可以直接使用memcpy复制的对象):
结构A
{
int x;
结构B
{
int I;
int j;
} b;
} a={1,{2,3 } };
拷贝初始化:
int I=0;
Foo类
{
公共:
Foo(int) {}
} foo=123
直接初始化:
int j(0)
Foo酒吧(123)
C++11标准初始化方式
C 11标准中{}的初始化方法是聚合类型,也就是拷贝的形式来赋值。
非聚合类型在C 11标准中由构造函数初始化。
聚合类型:
类型是一个普通的数组类型和一个类,
并且满足以下条件:
没有用户定义的构造函数、无私拥有或保护的非静态数据成员、没有基类、没有虚函数可以让非静态数据成员直接由{0}和=初始化
初始化列表技术细节
观察下面这两个:
int arr[] {1,2,3}
std:setint ss={1,2,3}
STL中不指定个数进行初始化之所以能实现,靠的是I轻量级的类模板,也是C++11中的新特性std::initializer_listinitializer_list使用。
FooVector类
{
STD:vector content _;
公共:
ovector(STD:initializer _ listintlist){//重要技术要点
for(auto it=list . begin();它!=list . end();它){
内容_。后退(*它)
}
}
}
Ovector foo _ 1={1,2,3,4,5 }//不仅如此
Ovector foo _ 2 ({1,2,3,4,5 })//也可以发送同类型的数据集。
initializer_list的特点:
它是一种轻量级容器类型,内部定义了迭代器等容器所必需的概念。对于std:initializer_list,可以接收任意长度的初始化列表,但是元素类型必须是相同的类型T(或者可以转换为T)它有3个成员接口:size(),begin(),end()。它只能作为一个整体进行初始化或赋值。
注意:std:initializer_list的效率很高,所以内部部门不负责保存初始化列表中元素的副本,只存储列表中元素的引用!因此,它不能用于返回临时变量!
避免类型收窄:
c有隐式类型转换的特点,比如给整数赋值浮点数,精度会损失,小数点后直接截断。初始化列表有助于避免隐式类型转换。因为它不允许这种转换发生。
但是也会随着编译器的不同而不同:
浮点ff=1.2
float ff={1.2}
在gcc4.8下没有警告和错误,但在Microsoft Visual C 2013中,会收到一个编译错误。因为1.2默认是double类型,由double转换成float会发生隐式类型转换,但是精度损失没有发生。
总结
C 11新的初始化方法给编程带来了很多方便,这也是新标准的思路和改进方向。
关于C 11系列学习列表初始化的这篇文章到此为止。关于C 11列表初始化的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。