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的更多相关文章

  1. CD 基金会、Jenkins、Jenkins X、Spinnaker 和 Tekton 的常问问题

    转载:https://mp.weixin.qq.com/s/bQLqGrCM9NZYI0Njlu4N-w FAQ 什么是持续交付(CD)? CD是一种软件工程方法,团队在短周期内生成软件,确保软件可以 ...

  2. Xamarin和微软发起.NET基金会

    新闻<微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn>,看到大家对微软的开放都很兴奋.在此之前在.NET社区也有了大量的开源项目,所列的24个项目也是早就开源,这次 ...

  3. 《HelloGitHub月刊》第06期

    前言 <HelloGitHub>月刊做到第06期了(已经做了6个月了),在GitHub上获得了100+的stars,虽然不多,但是我很知足了,说明有人觉得这个项目是有价值的.同时园子中的' ...

  4. iOS系列 基础篇 06 标签和按钮 (Label & Button)

    iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single Vi ...

  5. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  6. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  7. javascript基础06

      javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...

  8. Linux 第06天

    Linux 第06天 1.SAMBA服务器————(linux和windows的文件共享) 1.1 安装 yum install samba -yum 1.2 配置文件 /etc/samba/smb. ...

  9. plsql11.06注册码

    plsql11.06注册码:Product Code(产品编号):4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number(序列号):601769password ...

随机推荐

  1. 【翻译自mos文章】11gR2中的asm后台进程

    11gR2中的asm后台进程 參考原文: ASM Background Processes in 11.2 (Doc ID 1641678.1) 适用于: Oracle Database - Ente ...

  2. Linux内核——进程管理与调度

    进程的管理与调度 进程管理 进程描写叙述符及任务结构 进程存放在叫做任务队列(tasklist)的双向循环链表中.链表中的每一项包括一个详细进程的全部信息,类型为task_struct,称为进程描写叙 ...

  3. WebService之Soap头验证入门

    1.新建一个类,如"AuthHeaderUser",继承于"System.Web.Services.Protocols.SoapHeader"类 2.新建Web ...

  4. Unity3D之挥动武器产生的剑痕特效

    网维教程网 观看很多其它教程 眼下已知3种方法能够做这样的剑痕特效 1.尾随特效 2.程序实现动态面来处理剑痕动画. 3.美术实现剑痕动画,直接坐在模型动画里面 (由于我不会美术所以这个忽略 嘿嘿) ...

  5. gopkg:一种方便的go pakcage管理方式

    在使用go的过程中,我们有时候会引入一些第三方库来使用,而通常的方式就是使用go get,可是这样的方式有一个非常严重的问题,假设第三方库更新了相关接口,非常有可能你就无法使用了,所以我们一套非常好地 ...

  6. 通过action 跨进程启动activity

    在一些场景中我们需要从一个进程启动另外的一个应用的activity,这有什么好办法? 这里介绍一种方法,通过自定义 action 通过filter来启动. 如果你需要启动一个你自己写的另一个app的a ...

  7. 前端构建工具gulp

    前端构建工具gulp使用   前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gul ...

  8. c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

    测试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace ...

  9. OpenCV原则解读HAAR+Adaboost

    因为人脸检测项目.用途OpenCV在旧分类中的训练效果.因此该检测方法中所使用的分类归纳.加上自己的一些理解.重印一些好文章记录. 文章http://www.61ic.com/Article/DaVi ...

  10. 【SICP读书笔记(二)】使用过程来黏合数据 —— 酷炫吊的消息传递机制

    首先,让我们来看几个内建函数 (cons x y),作用是把x和y绑定成一个序对 (car z),作用是提取z序对的第一个元素 (cdr z),作用是提取z序对的第二个元素 容易看出,这个东西有点类似 ...