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 ...
随机推荐
- ubuntu19.10如何设置固定ip
$ip a 看见系统中有两块网卡 lo: ...... ens33: ...... #cd /etc/netplan$ls目录下面有文件01-network-manager-all.yaml $sud ...
- golang执行exec命令
创建对象: cmd, err := exec.Command("echo", "show me") 执行命令: cmd.Run() //Run 阻塞进程, ...
- spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)
一,为什么要更新caffeine缓存? 1,caffeine缓存的优点和缺点 生产环境中,caffeine缓存是我们在应用中使用的本地缓存, 它的优势在于存在于应用内,访问速度最快,通常都不到1ms就 ...
- centos8安装php7.4
一,下载php7.4 1,官方网站: https://www.php.net/ 2,下载 [root@yjweb source]# wget https://www.php.net/distribut ...
- Mac安装stf
1.brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config 2.node版本8.x我的是8.15.0 3.npm i ...
- jquery 添加html标签
<script type="text/javascript"> var sss = 1; function addFile() { if (sss < 20) { ...
- 第二十三章 Firewalld的防火墙
一.防火墙基本概述 在CentOS7系统中集成了多款防火墙管理工具,默认启用的是firewalld(动态防火墙管理器)防火墙管理工具,Firewalld支持CLI(命令行)以及GUI(图形)的两种管理 ...
- Ignite、Vertx
Ignite IpFinder 默认采用multicast的ip发现方式 优点: 集群较小时,配置方便 缺点 集群较大100s-1000s时,广播非常耗时,此时建议使用ZooKeeper发现机制(Zo ...
- oneshot_tjctf_2016
简单题,容易想到先泄漏libc基址,然后jump to onegadget 从而getshell from pwn import * ''' author: lemon time: 2020-10-2 ...
- STM32入门系列-GPIO结构
已经了解了STM32 GPIO的基本概念及引脚分类.现在来看下STM32 GPIO内部的结构是怎样的.IO端口位的基本结构如下图所示. 从图中可以看出GPIO内部结构还是比较复杂的,只要将这张GPIO ...