C++11&14新标准——统一初始化(Uniform Initialization)、Initializer_list(初始化列表)、explicit

系列文章目录

C++11&14新标准——Variadic templates(数量不定的模板参数)
C++11&14新标准——Uniform Initialization(统一初始化)、Initializer_list(初始化列表)、explicit



1. 统一初始化(Uniform Initialization)

  在C++11之前有多种初始化方式,包括以下几种:

1.int x1 = 5;
2.int x1(5);
3.int x1{
   5};
4.int x1 = {
   5};

  其中1、2为传统初始化语法,3、4为列表初始化,不仅是基本数据类型可以这样初始化,stl容器、自定义类和模板类都可以使用这些方法初始化。C++11之后,更推荐统一使用列表初始化。
  统一初始化的用法是用大括号{ }来进行初始化:

int values[]{
   1,2,3};

vector<int> v{
   1,2,3};

vector<int> v({
   1,2,3});//这不是统一初始化,而是构造函数接受一个Initializer_list的初始化。
vector<int> v={
   1,2,3};//这不是统一初始化,而是赋值初始化。
vector<string> n{
   "1","2","3"};

complex<double> c{
   3.0,4.0};

2. Initializer_list(初始化列表)

  用于构造的大括号其实是一个Initializer_list(初始化列表),其内部包含一个指向array头部的指针和array的长度,所以当使用Initializer list进行拷贝构造时,所指向的是同一个array。array是对数组进行改造而成的新容器,使其符合STL规范。
在这里插入图片描述
一个类可以有两种初始化:直接接受参数初始化或者接受一个Initializer list进行初始化。
在这里插入图片描述

P p(7,5); // 输出:P(int,int),a=7,b=5
P q{
   7,5}; // 输出:P(Initializer_list<int>), values= 7 5
P r{
   7,5,3}; // 输出:P(Initializer_list<int>), values= 7 5 3
P s={
   7,5}; // 输出:P(Initializer_list<int>), values= 7 5

  如果只定义了第一种初始化方式而没有第二种初始化方式,q和s仍然可以编译通过,因为编译器会将初始化列表进行拆解,然后调用第一种初始化方式。但r将无法编译通过,因为编译器将其列表拆解后,与第一种初始化方式的参数数量不符合,无法调用,所以会报错。

  如果只定义了第二种初始化方式而没有第一种初始化方式,则p无法初始化。因为虽然编译器会将初始化列表拆解为一个个的参数,但却不能将一个个的参数合并为一个初始化列表,这不是一个双向的过程!

禁止窄化转换

  在传统的初始化类型当中,允许高精度的数据类型给低精度的数据类型进行赋值,从而实现窄化转换。但统一初始化将不再允许窄化转换。

int a = 3.14; // 正确。a = 3;

int a{
   3.14}; // 错误!统一初始化不可以窄化转换

Initializer_list在标准库中的应用

C++11之后,标准库的容器也可以使用Initializer_list进行操作:
在这里插入图片描述
在这里插入图片描述

3. explicit

  explicit绝大多数情况下,都用在构造函数之前,效果是禁止隐式类型转换。在C++11之前,只能对参数个数为1的构造函数起作用。
在这里插入图片描述
  可以看到,在没加explicit的时候,5将会被隐式转换为Complex(5,0)的一个临时对象,然后再调用operator+进行操作;加上explicit就是阻止了这个隐式操作的过程,继续这样写编译器会报错。
  在C++11之后,explicit可以对多个实参的构造函数禁止隐式类型转换。
在这里插入图片描述

相关推荐

  1. C++11统一列表初始化,initializer_list

    2023-12-13 11:34:03       12 阅读
  2. C++ 初始化列表

    2023-12-13 11:34:03       47 阅读
  3. c++列表初始化

    2023-12-13 11:34:03       16 阅读
  4. C++:列表初始化

    2023-12-13 11:34:03       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 11:34:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 11:34:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 11:34:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 11:34:03       20 阅读

热门阅读

  1. 算法通关村——计算器问题解析

    2023-12-13 11:34:03       44 阅读
  2. 基于k-均值聚类的图像分割

    2023-12-13 11:34:03       43 阅读
  3. SQL注入绕过技术

    2023-12-13 11:34:03       35 阅读
  4. Vue 3实现将二维码导出为Word文档

    2023-12-13 11:34:03       37 阅读
  5. 拓展边界:前端世界的跨域挑战

    2023-12-13 11:34:03       34 阅读
  6. C#学习相关系列之自定义遍历器

    2023-12-13 11:34:03       46 阅读
  7. vue的组件传值

    2023-12-13 11:34:03       50 阅读
  8. 力扣139. 单词拆分

    2023-12-13 11:34:03       35 阅读
  9. ES SQL Translate API

    2023-12-13 11:34:03       48 阅读