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
版权声明:本文为博主原创文章,转载请附上博文链接!
C++中的初始化列表的更多相关文章
- C++中使用初始化列表的情况
http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或 ...
- C++-什么时候需要在类的构造函数中使用初始化列表
1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...
- C++中的初始化列表中可以对那些变量或对象进行初始化
构造函数与其函数体之间可以添加初始化列表,能对某些对象进行初始化.格式为 类名() : 变量1(参数1),变量2(参数2) { } 1. 父类的对象的构造必须在初始化列表中,如: 子类名(): ...
- C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...
- (转) C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
这是在面试中遇到的一个问题,没有答出来,后来上网上查了一些资料,终于弄明白了: 一.首先c++标准规定成员变量必须在调用构造函数前进行初始化(这一点很重要) 二.如果我们在构造函数中对成员变量进行初始 ...
- 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)
最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...
- C++中初始化列表的使用
1,初始化列表是在 C++ 中才引入的: 2,以“类中是否可以定义 const 成员?”这个问题来引入初始化列表: 1,const 这个关键字可以定义真正意义上的常量,也可以在某些情况下定义只读变量: ...
- C++中初始化列表的使用(总结)
原文链接 https://www.cnblogs.com/dishengAndziyu/p/10906081.html 参考链接:https://www.cnblogs.com/laiqun/p/57 ...
随机推荐
- 原生JavaScript实战之搜索框筛选功能
成品图如下所示: 先搭建HTML结构: <div class="wrapper"> <div class="sWrapper"> < ...
- concurrent包下的Exchanger练习
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据. 当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exc ...
- 进击的Python【第十六章】:Web前端基础之jQuery
进击的Python[第十六章]:Web前端基础之jQuery 一.什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多&quo ...
- [HNOI2008]Card洗牌
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...
- _bzoj3223 Tyvj 1729 文艺平衡树【Splay】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3223 裸的,打个标记. #include <cstdio> #include & ...
- 递推DP UVA 473 Raucous Rockers
题目传送门 题意:n首个按照给定顺序存在m张光盘里,每首歌有播放时间ti,并且只能完整的存在一张光盘里,问最多能存几首歌 分析:类似01背包和完全背包,每首歌可存可不存,存到下一张光盘的情况是当前存不 ...
- ACM_查找ACM(加强版)
查找ACM(加强版) Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为一个acmer,应该具备团队合作能力和分析问题能力.给你 ...
- 【转】Java中,&&与&,||与|的区别
转自:http://blog.csdn.net/lishiyuzuji/article/details/8116516 在Java的逻辑运算符中,有这么四类:&&(短路与),& ...
- CentOS 7 下配置 firewalld(firewall-cmd)实现 NAT 转发 软路由
如果配合 DHCP 服务或实现更多功能. ☼ NAT 转发软路由 开启 NAT 转发之后,只要本机可以上网,不论是单网卡还是多网卡,局域网内的其他机器可以将默认网关设置为已开启 NAT 转发的服务器 ...
- Elasticsearch--集群&吞吐量
目录 高查询和高吞吐量 过滤器缓存 字段数据缓存和断路器 断路器 存储模块 索引缓冲和刷新率 索引刷新率 线程池的配置 一些通用的建议来配置高索引和查询吞吐量的集群 高查询和高吞吐量 过滤器缓存 过滤 ...