【C++基金会 06】explictkeyword
C++提供keywordexplicit,你应该不能阻止的转换构造隐式转换发生的同意。声明explicit的构造不能在一个隐式转换使用。
1.演示样例
我们先来看一段演示样例代码:
class A
{
public:
A(int v):var(v){};//带一个int型值的构造函数
bool isSame(const A& ref) const {return var == ref.var;}//判等函数
private:
int var;//成员变量var
}; void main()
{
A a(5);//构造a对象
A b(5);//构造b对象
if (a.isSame(b))
cout<<"a==b"<<endl;
else
cout<<"a!=b"<<endl;
}
上述代码获得结果是a==b。假设A b(3),获得的结果就是a!=b。
2.构造函数定义引起的隐式转换
因为构造函数须要传入一个int型初始值,因此能够觉得这是一个隐式转换。把一个int型值转换为一个A类型的对象。
所以假设改动main函数为例如以下代码。
class A
{
public:
A(int v):var(v){};//带一个int型值的构造函数
bool isSame(const A& ref) const {return var==ref.var;}//判等函数
private:
int var;//成员变量var
}; void main()
{
A a(5);//构造a对象
if (a.isSame(5))//这里会由于构造函数的隐式转换。因而正确运行isSame
cout<<"a==b"<<endl;
else
cout<<"a!=b"<<endl;
}
这看起来不错,好像还省了不少力气。可是这种使用依赖于用户是否有对应的需求,有时候它将成为一个bug。所以更好的办法是抑制这种由构造函数引起的隐式转换。
3.抑制抑制由构造函数定义的隐式转换
在构造函数中引入explicit能够帮我们解决问题。
class A
{
public:
explicit A(int v):var(v){};//带一个int型值的构造函数
bool isSame(const A& ref) const {return var==ref.var;}//判等函数
private:
int var;//成员变量var
}; void main()
{
A a(5);//构造a对象
if (a.isSame(5))
cout<<"a==b"<<endl;
else
cout<<"a!=b"<<endl;
}
//输出结果
error C2664: “A::isSame”: 不能将參数 1 从“int”转换为“const A &”
1> 原因例如以下: 无法从“int”转换为“const A”
1>
这样一来构造函数就无法进行隐式转换,
4.为转换进行显式使用构造函数
这时候仍想进行转换的话。显式使用构造函数吧。
class A
{
public:
explicit A(int v):var(v){};//带一个int型值的构造函数
bool isSame(const A& ref) const {return var==ref.var;}//判等函数
private:
int var;//成员变量var
}; void main()
{
A a(5);//构造a对象
if (a.isSame(A(5))//显示使用构造函数
cout<<"a==b"<<endl;
else
cout<<"a!=b"<<endl;
}
5.总结
除非有明显的理由想利用构造函数定义的隐式转换。否则设置explicit能够避免一些错误,当须要进行转换的时候,由用户显式地调用构造函数。当然C++的暂时对象都是const,假设isSame函參不是const型。则隐式调用构造函数时生成的瞬态对象不能传递。
版权声明:本文博主原创文章,博客,未经同意不得转载。
【C++基金会 06】explictkeyword的更多相关文章
- CD 基金会、Jenkins、Jenkins X、Spinnaker 和 Tekton 的常问问题
转载:https://mp.weixin.qq.com/s/bQLqGrCM9NZYI0Njlu4N-w FAQ 什么是持续交付(CD)? CD是一种软件工程方法,团队在短周期内生成软件,确保软件可以 ...
- Xamarin和微软发起.NET基金会
新闻<微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn>,看到大家对微软的开放都很兴奋.在此之前在.NET社区也有了大量的开源项目,所列的24个项目也是早就开源,这次 ...
- 《HelloGitHub月刊》第06期
前言 <HelloGitHub>月刊做到第06期了(已经做了6个月了),在GitHub上获得了100+的stars,虽然不多,但是我很知足了,说明有人觉得这个项目是有价值的.同时园子中的' ...
- iOS系列 基础篇 06 标签和按钮 (Label & Button)
iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single Vi ...
- javaSE基础06
javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...
- 异步编程系列06章 以Task为基础的异步模式(TAP)
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- javascript基础06
javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...
- Linux 第06天
Linux 第06天 1.SAMBA服务器————(linux和windows的文件共享) 1.1 安装 yum install samba -yum 1.2 配置文件 /etc/samba/smb. ...
- plsql11.06注册码
plsql11.06注册码:Product Code(产品编号):4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number(序列号):601769password ...
随机推荐
- linux下用shell删除三天前或者三天内的文件
说明:+n 大于 n, -n 小于 n, n 相等于 n. find / -amin -30 -ls # 查找在系统中最后30分钟访问的文件find / -atime -2 -ls # 查找在系统中最 ...
- Cocos2d-x学习笔记(1)
Cocos2d-x原型Cocos2d,基于Cocos2d-iPhone,跨平台. Hello Workd分析: 1."resource"目录 该目录主要用于存放游戏中须要的图片.音 ...
- Android 5.0 开发者官方网站疏理知识结构
Android 5.0 开发人员官网知识结构疏理 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...
- [jQuery]地图浏览:如何实现图片的放大缩小和点击之后的位置居中
HTML代码: <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis. ...
- Hibernate操作Clob数据类型
在POJO字符串可以声明为一个大型对象java.lang.String要么java.sql.Clob种类. 当程序从数据库加载Clob数据的类型.负荷只有一个Clob数据的逻辑指针类型.我们需要通过使 ...
- Vue.js学习与理解
Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue.js 自身不 ...
- 举例说,在命令模式(Command Pattern)
在前面加上 谈到命令,大部分的人脑海中会想到以下这幅画面 这在现实生活中是一副讽刺漫画,做决定的人不清楚运行决定的人有何特点,瞎指挥.外行领导内行说的就是这样的.只是在软件设计领域,我们显然要为这 ...
- Linux下一个php+mysql+nginx构建编译(三)
在此之前一直是一个关键构建webserver.但一个关键的建筑环境都比较旧的.假定使用一个相对较新的环境,尤其是正式的server.您必须手动编译自己建(基于以下的结构linux centos6.5 ...
- poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)
http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它主要的性质. 1.欧拉函数是求小于n且和n互质(包含1)的正整数的个数. 记为φ(n). 2. ...
- Java获取的一天、本星期、这个月、本季度、一年等 开始和结束时间
1.代码 package com.zhaochao.utils; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...