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
版权声明:本文为博主原创文章,转载请附上博文链接!

C++中的初始化列表的更多相关文章

  1. C++中使用初始化列表的情况

    http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或 ...

  2. C++-什么时候需要在类的构造函数中使用初始化列表

    1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...

  3. C++中的初始化列表中可以对那些变量或对象进行初始化

    构造函数与其函数体之间可以添加初始化列表,能对某些对象进行初始化.格式为 类名() : 变量1(参数1),变量2(参数2) { } 1.     父类的对象的构造必须在初始化列表中,如: 子类名(): ...

  4. C++中成员初始化列表的使用

    C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...

  5. (转) C++中成员初始化列表的使用

    C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...

  6. C++中使用初始化列表比在构造函数中对成员变量赋值更高效

    这是在面试中遇到的一个问题,没有答出来,后来上网上查了一些资料,终于弄明白了: 一.首先c++标准规定成员变量必须在调用构造函数前进行初始化(这一点很重要) 二.如果我们在构造函数中对成员变量进行初始 ...

  7. 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)

    最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...

  8. C++中初始化列表的使用

    1,初始化列表是在 C++ 中才引入的: 2,以“类中是否可以定义 const 成员?”这个问题来引入初始化列表: 1,const 这个关键字可以定义真正意义上的常量,也可以在某些情况下定义只读变量: ...

  9. C++中初始化列表的使用(总结)

    原文链接 https://www.cnblogs.com/dishengAndziyu/p/10906081.html 参考链接:https://www.cnblogs.com/laiqun/p/57 ...

随机推荐

  1. Gym 100512G Grand Tour (拓扑排序)

    题意:一个团队要去参观一些学校,某些学校要在某些学校之前先参观,并且每个学校有一个权值,团队去的时间与权值的差作为难过度(最小是0), 所有的难过度的最大值是伤心度,让你安排参观顺序,使得这个伤心度最 ...

  2. python运行selenium时出现的一个错误总结

    1.SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 场景:运用pan ...

  3. bzoj 1922: [Sdoi2010]大陆争霸【dijskstra】

    d[u]为u被几个节点保护,d1[u]为最早到u的时间,d2[u]为u的最早可进入时间(保护点都被打下来了的时候),然后最终最早进入时间就是max(d1[u],d2[u]),把这个作为权值放进小根堆, ...

  4. bzoj 1610: [Usaco2008 Feb]Line连线游戏【瞎搞】

    阴沟翻船.jpg 居然忘了除0的情况 枚举两两之间的线,把斜率装起来排个序去个重就好了 真是水的一晚上呢 #include<iostream> #include<cstdio> ...

  5. bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】

    枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图 ...

  6. 51nod 1222 最小公倍数计数【莫比乌斯反演】

    参考:https://www.cnblogs.com/SilverNebula/p/7045199.html 所是反演其实反演作用不大,又是一道做起来感觉诡异的题 转成前缀和相减的形式 \[ \sum ...

  7. [SHOI2002]取石子游戏之三

    Wythoff's Game,详解请见浅谈算法--博弈论中的例6 /*program from Wolfycz*/ #include<cmath> #include<cstdio&g ...

  8. Vasiliy's Multiset CodeForces -706D || 01字典树模板

    就是一个模板 注意这题有一个要求:有一个额外的0一直保持在集合中 #include<cstdio> #include<algorithm> using namespace st ...

  9. C#中如何判断键盘按键和组合键

    好记性不如烂笔头子,现在记录下来,不一定会有很详尽的实例,只写最核心的部分. C# winform的窗体类有KeyPreview属性,可以接收窗体内控件的键盘事件注册.窗体和控件都有KeyDown,K ...

  10. 转】MongoDB 自动分片 auto sharding

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! MongoDB 自动分片 auto shard ...