大家好我是发哥,本期说说C++11列表初始化。
我们知道,在 C++98/03 中的对象初始化方法有很多种,请看下面的代码:
int arry[3] = { 1, 2, 3 }; //普通数组
struct A
{
int x;
struct B
{
int y;
int z;
} b;
} a = { 1, { 2, 3 } }; //POD类型
int i = 0;//拷贝初始化(copy-initialization)
class Food
{
public:
Food (int) {}
} food = 123; //需要拷贝构造函数
int j(0);//直接初始化(direct-initialization)
Food bar(123);//直接初始化(direct-initialization)
上述这些有不同的初始化方法,都有各自的适用范围和作用。最关键的是,这些种类繁多的初始化方法,没有一种可以通用所有情况,使用起来比较不方便。
为了统一初始化方式,并且让初始化行为具有确定的效果,C++11 中提出了列表初始化(List-initialization)的概念。
初始化列表的适用性被大大增加了。它现在可以用于任何类型对象的初始化,请看下面的代码。
通过初始化列表初始化对象。
class Food
{
public:
Food (int) {}
private:
Food (const Foo &);
};
int main(void)
{
Food a1(235);
Food a2 = 235; //错误Food (const Food &)是私有的
Food a3 = { 235 };
Food a4 { 235 };
int a5 = { 457 };
int a6 { 459 };
return 0;
}
上例中,a3、a4 使用了新的初始化方式来初始化对象,效果如同 a1 的直接初始化。
a5、a6 则是基本数据类型的列表初始化方式。可以看到,它们的形式都是统一的。
a4 和 a6 的写法,是 C++98/03 所不具备的。在 C++11 中,可以直接在变量名后面跟上初始化列表,来进行对象的初始化。
由上面的这些例子可以看到,在 C++11 中使用初始化列表是非常便利的。它不仅统一了各种对象的初始化方式,而且还使代码的书写更加简单清晰。
今天就说到这,谢谢你的关注,记得点赞、评论和关注哦,后期会有更好的优秀作品呈现,你的支持是我创建继续创造优秀作品的动力。
明天早上六点我们继续再聊。