C++11中列表初始化机制详解

本文详细探讨了C++11中的列表初始化机制,包括POD类型和含有构造函数的类的初始化,以及在函数返回值中的应用。文章还介绍了std::initializer_list的作用,并通过代码验证了列表初始化的实现原理。
摘要由CSDN通过智能技术生成

目录

概述

实现机制详解

POD类型的列表初始化

含有构造函数的类的列表初始化(C++11)

列表初始化用于函数返回值

引入std::initializer_list

代码验证

应用

总结


概述

  • 定义:列表初始化是C++11引入的新标准,目的是统一初始化方式

  • C++11以前只能使用列表初始化来初始化内置类型数组和POD类型对象,C++11中列表初始化可以用于初始化任何类型对象

    • POD(plain old data)类型:仅由内置类型变量构成且不含指针的类,简单来说是可以直接使用memcpy复制的对象

    • 聚合体(aggregate):聚合体一定是POD类型

      • 无自定义构造函数

      • 无私有或保护的非静态数据成员(静态成员与单独对象无关,故不影响初始化)

      • 无基类

      • 无虚函数

      • 无类内已经初始化的非静态数据成员

注意:区分列表初始化和初始化列表

        列表初始化:用{}进行初始化的方式

        初始化列表:构造函数体前对对象成员直接进行初始化的列表

        initializer_list:一种用于未定参数的轻量STL容器


实现机制详解

对内置类型对象、POD对象和类对象的列表初始化实现细节是不同的

POD类型的列表初始化

  • 此处POD类型包括:内置类型、聚合体类

  • 内置类型数组按照顺序初始化

    • C++11标准中列表初始化会防止可能导致潜在信息丢失的类型缩小(即不能像赋值一样将大类型如int隐式转换成小类型如char)

  • 聚合体类按照成员定义顺序依次初始化

含有构造函数的类的列表初始化(C++11)

  • 通过{}进行初始化和()结果一致【即通过()调用构造函数的地方都可以完全等价地用{}代替】,都是直接用括号内的值调用对应构造函数直接初始化对象,并不会先生成临时对象再拷贝

  • ={}与{}是等价的语法【即加不加=对初始化行为没有影响】,均不会调用拷贝运算符或拷贝构造函数

  • 与内置类型的列表初始化一致,C++11的列表初始化只能用于初始化,不能用于已初始化对象的赋值

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值