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 ...
随机推荐
- 自动创建新序列号的Cookies脚本
已知一个网站在被访问的时候会读取电脑上存储的cookies 如果已经有cookie变量存在 则在存在的变量后按顺序增加新的序列 如电脑上有vst1变量的cookie了 那么新用户则自动创建为 vst2 ...
- MeteoInfoLab脚本示例:计算垂直螺旋度
尝试编写MeteoInfoLab脚本计算垂直螺旋度,结果未经验证. 脚本程序: print 'Open data files...' f_uwnd = addfile('D:/Temp/nc/uwnd ...
- .Net Core中使用Grpc
一.Grpc概述 gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型.gRPC 默认使用protocol buffers作为接口定义语言,来描述服务接口和有效载荷消息 ...
- 如何设计一个牛逼的API接口
在日常开发中,总会接触到各种接口.前后端数据传输接口,第三方业务平台接口.一个平台的前后端数据传输接口一般都会在内网环境下通信,而且会使用安全框架,所以安全性可以得到很好的保护.这篇文章重点讨论一下提 ...
- 为什么说switch比if快
C++的switch语法 在C++中,switch只接受整型常量作为分支的值: switch (expr) { case integral-constant : \\... break; case i ...
- 再过两年C语言就50岁了,这么老的编程语言怎么还没有过时?
再过两年,C语言将迎来它的 50 岁生日,同样进行周年庆的还有 PL/M和Prolog.不过,C语言至今仍然非常受欢迎,它在几乎所有编程语言中的受欢迎程度,始终排在前十名. 大多数操作系统的内核( ...
- hugo官方相关文档地址
+++ date="2020-10-17" title="hugo官方相关文档地址" tags=["hugo"] categories=[& ...
- spring boot:用shardingjdbc实现多数据源的分库分表(shardingsphere 4.1.1/spring boot 2.3.1)
一,shardingjdbc的用途 1,官方站介绍: Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈, 它由 JDBC.Proxy 和 Sidecar( ...
- 华为路由器配置OSPF
OSPF是什么 OSPF(Open Shortest Pass First,开放最短路径优先协议),是一个最常用的内部网管协议,是一个链路状态协议. 使用场景:适用于运营商.政府机构等大型网络中多节点 ...
- NCEP数据资料获取 地面抬升指数
先放上数据地址:https://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.surface.html 美国国家环境预报中心(NCEP ...