C++中的初始化列表

C++11扩大了列表初始化的适用范围,使其可以用于所有内置类型和用户定义的类型(即类对象)。

1、当列表初始化用于内置类型的变量时,这种初始化形式有一个重要的特点:如果我们使用列表初始化且初始化值存在丢失信息的风险,则编译器将报错。也就是说在使用列表初始化时编译器将禁止将变量类型进行缩窄转换,即不能将宽的变量类型通过列表初始化的形式初始化给窄的变量。例子如下:

#include <iostream>

using namespace std;

int main()
{
  int i = 3;
  double d = 3.14;

  char c1{ i };//int转化成int
  short a{ i };//int转化成short

  char c2{ d };//double转化成char
  short c3{ d };//double转化成short
  float f{ d };//double转化成float

  system("pause");
  return 0;
}
在VS2015中编译结果如下:

 

在g++中编译结果如下:

 

从上面可以看出,在VS中会报错,而在g++中只是给出警告。

2、对于列表初始化内置类型的变量,编译器虽然禁止将变量类型进行缩窄转换。但是对于字面值常量,如果在较窄类型的取值范围内,部分类型的字面值常量可以用来列表初始化较窄的类型。例子如下:

#include <iostream>

using namespace std;

int main()
{
  //66是int类型的,因为对于十进制的字面值默认是带符号数,
  //其类型是int、long、long long中尺寸最小的那个
  //66.6是double类型,因为默认浮点型字面值是一个double
  char c1{ 66 }; //int转化成char
  short s{ 66 }; //int转化成short

  char c2{ 66.6 }; //double转化成char
  int i{ 66.6 }; //double转化成int
  float f{ 66.6 };//double转化成float

  //扩展
  double d1{ 66 }; //int转化成double
  double d2{'c'};//char转化成double
  double d3{66.6f};//float转化成double

  system("pause");
  return 0;
}
在VS2015中编译结果如下:

 

从上面结果可知:对于浮点型字面常量不允许列表初始化更窄的类型变量,即使都是浮点型;而对于整型字面值常量可以列表初始化更窄的类型变量。对于整型字面值常量、字符型字面值常量可以列表初始化diuble型变量,在3中我们将看到用int型变量不能列表初始化double类型变量。对于float型字面值常量可以列表初始化double型变量,这和3中一致。

3、在《C++ primer plus》中P796页中:列表初始化允许转换为更宽的类型。但实验中发现列表初始化并不是允许所有的窄类型转化成宽类型变量。例子如下:

#include <iostream>

using namespace std;

int main()
{
  char c = 'c';
  short s = 3;
  int i = 3;
  float f = 3.14f;

  int i1{ s };//short转换成int
  int i2{ c };//char转换成int
  double d1{ c };//char转换成double
  double d2{ s };//short转换成double
  double d3{ i }; //int转换成double

  double d4{ f };//float转换成double
  int64_t it{ f };//float转换成int64_t(8byte)

  system("pause");
  return 0;
}
在VS2015中编译结果如下:

 

从结果可以看出使用列表初始化时,只允许窄整型向宽整型、窄浮点型向更宽的浮点型转换。窄整型不能向更宽的浮点型转换,窄浮点型也不能向更宽的整型转换。

4、总结

总结以上,可以得出结论如下:

    在使用列表初始化初始内置类型的变量时:

         1)使用了列表初始化,将禁止将任何内置类型的变量进行缩窄转换。

         2)对于使用字面值常量列表初始化内置类型的变量时,对于整型字面值常量可以缩窄成整型变量类型。浮点型字面值量

               不能缩窄成整型变量类型和浮点变量类型。

         3)使用列表初始化内置类型变量时,只允许窄整型变量向宽整型变量、窄浮点型变量向更宽的浮点型变量转换。窄整型变

               量不能向更宽的浮点型变量转换,窄浮点型变量也不能向更宽的整型变量转换。但是对于字面值常量,窄整型的字面值

               常量可以向宽整型的浮点型变量转换。

====》》》对于字面值常量的类型,可以参考《C++ primer》P35页

====》》》对于列表初始化,可以参考《C++ primer》P39页和《C++ primer plus》P796页
---------------------
作者:flychildc
来源:CSDN
原文:https://blog.csdn.net/J_H_C/article/details/83579131
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/flychildc/p/9884376.html