【C++11】列表初始化和std::initializer_lis使用总结

1. 变量初始化

   先看下C98里都是如何进行变量初始化的。

  •    数组初始化(使用了初始化列表)
int i_arr[3] = { 1, 2, 3 };  //普通数组
  •   POD类型初始化(使用了初始化列表)【POD 类型即 plain old data 类型,简单来说,是可以直接使用 memcpy 复制的对象】
struct A
{
    int x;
    struct B
    {
        int i;
        int j;
    } b;
} a = { 1, { 2, 3 } };  //POD类型
  •   内置类型初始化 
int i=0;
  •    自定义对象初始化(使用拷贝构造函数) 
class Foo
{
    public:
    Foo(int) {}
} foo = 123;  //需要拷贝构造函数
  •   直接初始化 
int j(0);
Foo bar(123);

从上述罗列的初始化的方法中看,在C++98/03中我们只能对普通数组和POD(plain old data,简单来说就是可以用memcpy复制的对象)类型可以使用列表初始化。

所有的这些初始化方法,都有各自的适用范围和作用,而且这些种类繁多的初始化方法,没有一种可以通用所有情况。

那么为了统一初始化方式,并且让初始化行为具有确定的效果,C++11 中提出了列表初始化(List-initialization)的概念。 

 

2. 列表初始化

C++11 中,初始化列表的适用性被大大增加了。它可以用于任何类型对象的初始化。

示例1:

// 自定义类Foo
class Foo
{
public:
    Foo(int) {}
private:
    Foo(const Foo &);
};

int main(void)
{
{
	Foo a1(123); //调用Foo(int)构造函数初始化
	Foo a2 = 123; //error Foo的拷贝构造函数声明为私有的,该处的初始化方式是隐式调用Foo(int)构造函数生成一个临时的匿名对象,再调用拷贝构造函数完成初始化
 
	Foo a3 = { 123 }; //列表初始化
	Foo a4 { 123 }; //列表初始化
 
	int a5 = { 3 };
	int a6 { 3 };
    return 0;
}

 注释:

  •           a3、a4 使用了新的初始化方式,初始化列表来
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值