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. linux下用shell删除三天前或者三天内的文件

    说明:+n 大于 n, -n 小于 n, n 相等于 n. find / -amin -30 -ls # 查找在系统中最后30分钟访问的文件find / -atime -2 -ls # 查找在系统中最 ...

  2. Cocos2d-x学习笔记(1)

    Cocos2d-x原型Cocos2d,基于Cocos2d-iPhone,跨平台. Hello Workd分析: 1."resource"目录 该目录主要用于存放游戏中须要的图片.音 ...

  3. Android 5.0 开发者官方网站疏理知识结构

    Android 5.0 开发人员官网知识结构疏理 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...

  4. [jQuery]地图浏览:如何实现图片的放大缩小和点击之后的位置居中

    HTML代码: <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis. ...

  5. Hibernate操作Clob数据类型

    在POJO字符串可以声明为一个大型对象java.lang.String要么java.sql.Clob种类. 当程序从数据库加载Clob数据的类型.负荷只有一个Clob数据的逻辑指针类型.我们需要通过使 ...

  6. Vue.js学习与理解

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue.js 自身不 ...

  7. 举例说,在命令模式(Command Pattern)

    在前面加上 谈到命令,大部分的人脑海中会想到以下这幅画面   这在现实生活中是一副讽刺漫画,做决定的人不清楚运行决定的人有何特点,瞎指挥.外行领导内行说的就是这样的.只是在软件设计领域,我们显然要为这 ...

  8. Linux下一个php+mysql+nginx构建编译(三)

    在此之前一直是一个关键构建webserver.但一个关键的建筑环境都比较旧的.假定使用一个相对较新的环境,尤其是正式的server.您必须手动编译自己建(基于以下的结构linux centos6.5 ...

  9. poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)

    http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它主要的性质. 1.欧拉函数是求小于n且和n互质(包含1)的正整数的个数. 记为φ(n). 2. ...

  10. Java获取的一天、本星期、这个月、本季度、一年等 开始和结束时间

    1.代码 package com.zhaochao.utils; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...