Effective Modern C++ ——条款7 在创建对象时注意区分()和{}
杂项
在本条款的开头书中提到了两个细节性问题:
1、类中成员初始化的时候不能使用小括号。
如:
class A {
int a(0);//错误
};
2、对于原子性类别的对象初始化的时候不能使用=
如:
std::atomic<int> a = 0;//错误
大括号初始化的特性(以下都是使用{}初始化对象时具备的特性):
1、禁止窄式类别转换
double x,y,z;
int sum(x+y+z);//错误 double之和可能无法用int 表达
2、能避免令人苦恼的解析语法
C++规定:任何能解释为声明的语句都要解释为声明。
MyClass w();//你只是想新建一个对象,但是编译器可能会解释为你在声明一个函数
3、std::initializer_list型别对于编译器有着致命吸引力。
在你的构造函数中,如果出现形参型别为std::initializer_list,编译器会想尽一切办法调用这个构造函数初始化对象。
class A {
public:
A(int i, double b){};
A(std::initializer_list<bool> i){};
};
int main() {
A a{10, 6.0};//错误,无法从double转换成bool(窄化转换)
}
下面这种情况就不用多说了:
class A {
public:
A(int i, bool b){};
A(std::initializer_list<double> i){};
};
int main() {
A a{10, 6.0};//编译器很开心的会调用第二个构造函数
}
所以除非你不给他任何机会:
class A {
public:
A(int i, double b){};
A(std::initializer_list<string> i){};
};
int main() {
A a{10, 6.0};//编译器没办法了,只能调用第一个了。
}
还有一种例外的情况就是在你既支持默认构造函数,又支持带有std::initializer_list类型的构造函数的时候;
使用空大括号构造对象时,会调用默认的构造函数,意义是没有实参,除非你用两个大括号像这样:Myclass a{{}}
关于大括号和小括号区别
在vector中有例子佐证:
std::vector<int> v1(10, 20)//小括号,老老实实创建了一个vector 含有10个元素,元素值都为20;
std::vector<int> v2{10,20}//大括号,调用带有std::initializer_list形参的构造函数,创建一个含有两个元素的vector 元素值为10,20
Effective Modern C++ ——条款7 在创建对象时注意区分()和{}的更多相关文章
- Effective Modern C++ ——条款6 当auto型别不符合要求时,使用带显式型别的初始化物习惯用法
类的代理对象 其实这部分内容主要是说明了在STL或者某些其他代码的容器中,在一些代理类的作用下使得最后的返回值并不是想要的结果. 而他的返回值则是类中的一个容器,看下面的一段代码: std::vect ...
- Effective Modern C++ 条款4:掌握查看型别推导结果的方法
采用何种工具来查看型别推导结果,取决于你在软件开发过程的哪个阶段需要该信息.主要研究三个可能的阶段:撰写代码阶段.编译阶段.运行时阶段. IDE编译器 IDE中的代码编译器通常会在你将鼠标指针选停止某 ...
- Effective Modern C++ 条款3:理解decltype
说起decltype,这是个古灵精怪的东西.对于给定的名字或表达式,decltype能告诉你该名字或表达式的型别.一般来说,它告诉你的结果和你预测的是一样的.不过,偶尔它也会给出某个结果,让你抓耳挠腮 ...
- Effective Modern C++ 条款2:理解auto型别推导
在条款1中,我们已经了解了有关模板型别的推导的一切必要知识,那么也就意味着基本上了解了auto型别推导的一切必要知识. 因为,除了一个奇妙的例外情况,auto型别推导就是模板型别推导.尽管和模板型别推 ...
- Effective Modern C++ ——条款5 优先选择auto,而非显式型别声明
条款5 对于auto ,他的好处不仅仅是少打一些字这么简单. 首先在声明的时候, 使用auto会让我们养成初始化的习惯: auto x;//编译不通过必须初始化. 再次对于auto而言,它可以让我们定 ...
- Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype
条款2.理解auto型别推导 对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的.只有一种特例情况. 我们先针对auto和模板型别推导一致的情况进行讨论: //某变量采用auto来声 ...
- Effective Modern C++:03转向现代C++
07:在创建对象时注意区分()和{} 自C++11以来,指定初始化值的的方式包括使用小括号,等号,以及大括号: ); // initializer is in parentheses ; // ini ...
- Effective Modern C++翻译(1):序言
/*********************************************************** 关于书: 书是我从网上找到的effective Modern C++的样章,内 ...
- 《Effective Modern C++》翻译--简单介绍
北京时间2016年1月9日10:31:06.正式開始翻译.水平有限,各位看官若有觉得不妥之处,请批评指正. 之前已经有人翻译了前几个条目,有些借鉴出处:http://www.cnblogs.com/m ...
随机推荐
- centos7 安装k8s kubectl 客户端
1. 配置k8s的kubelet 管理客户端 1 cat <<EOF > /etc/yum.repos.d/kubernetes.repo 2 [kubernetes] 3 name ...
- centos7 samba安装教程
samba的用途:有的时候,我们需要在centos7 的文件能共享给其他机器. rpm -qa|grep samba yum install -y samba setenforce 0 sed -i ...
- 热力图 vue 项目中使用热力图插件 “heatmap.js”(保姆式教程)
我现在写的这项目是用CDN引入 heatmap.js, 可根据自己项目情况使用哪种方式引入插件. 官网地址 "https://www.patrick-wied.at/static/heatm ...
- Linux nginx 安装 启动
nginx下载地址:https://nginx.org/download/ ## 解压 tar -zxvf nginx-1.9.9.tar.gz ##进入nginx目录 cd nginx-1.9.9 ...
- 如何win10 上访问虚拟机(linux)上redis方法
上一回linux上安装了redis,but在window上面连接不上/??? 配置了密码,不行, 防火墙端口打开了也不行??? 1. 首先要修改redis 的配置文件,找到bind节点,修改bind的 ...
- 如果你想or即将成为一名程序员,那你需要知道这些东西!上岗须知~
前两天公司学院的同学给我看了一下即将入职的应届生的数量,真是不少.感慨一下,一批新人即将到来,而自己又老去了一岁.码农是一个必将终身学习的职业.而相关的知识越来越多了.接下来该学什么?接下来该干什么? ...
- 【博弈论】51Nod 1534 棋子游戏
题目内容 波雷卡普和瓦西里喜欢简单的逻辑游戏.今天他们玩了一个游戏,这个游戏在一个很大的棋盘上进行,他们每个人有一个棋子.他们轮流移动自己的棋子,波雷卡普先开始.每一步移动中,波雷卡普可以将他的棋子从 ...
- Linux基础命令列表
命令列表 A alias apt apt-get arp -n -s arping ab B bc basename bash -n -x bzip2 bunzip2 bzcat blkid brct ...
- 深信服edr 2020HW行动0day 漏洞细节
漏洞1 一下4个漏洞触发都在其他文件,这里只进行漏洞点的分析. 漏洞点tool\log\c.php 启动c.php大约140行-148行 这里执行了两个方法 show_form 与main 这里追踪s ...
- (Pixel2PixelGANs)Image-to-Image translation with conditional adversarial networks
Introduction 1. develop a common framework for all problems that are the task of predicting pixels f ...