在C++类的实例化过程中,存在一种隐式转换,即可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换

一个简单的例子:

#include <iostream>
#include <string>using namespace std;class Book
{
public:Book(){}Book(const string name, const int price = 100) : _name(name), _price(price){cout << "构造函数调用!" << endl;;};void IsSameBook(const Book & book){if (_name == book._name)cout << "两本书重名!" << endl;elsecout << "两本书不重名!" << endl;}
private:string _name;int _price;
};void main()
{Book A("AA");    A.IsSameBook(string("AA"));   system("Pause");
}

执行输出:

构造函数调用!
构造函数调用!
两本书重名!

这里的第一次构造函数调用是声明Book类的实例A,第二次构造函数调用是因为用 string类型的 “AA”作为IsSameBook函数的形参,这个函数本来的形参应该是一个Book的类对象,而类Book又满足构造函数只含有一个未初始化的形参的条件(可以含有多个已经有初始化值的形参),所以这里编译器就默认执行了一次隐式转换,把“AA”作为形参,实例化了一个Book类的临时对象object,这样,对象A就和这个object对象判断名字是否一样,从而有了两本书重名的判断。这个临时object对象在函数结束的时候就销毁了。

为了防止这种意料之外的隐式转换,在类的构造函数前加上explicit关键字,可以防止形参隐式转换为该类类型的转换:

#include <iostream>
#include <string>using namespace std;class Book
{
public:Book(){}explicit Book(const string name, const int price = 100) : _name(name), _price(price){cout << "构造函数调用!" << endl;;};void IsSameBook(const Book & book){if (_name == book._name)cout << "两本书重名!" << endl;elsecout << "两本书不重名!" << endl;}
private:string _name;int _price;
};void main()
{Book A("AA");    Book B = Book("AA");A.IsSameBook(B); system("Pause");
}

构造函数加上explicit关键字之后,使用A.IsSameBook(string("AA"))的写法,编译器会报错。explicit的作用就是防止其他类型对该类类型的隐式转换,但仍可以以显示转换的方式调用, 如 Book B=Book("AA")的写法。

转载于:https://www.cnblogs.com/mtcnn/p/9411826.html

C++中explicit关键字用法相关推荐

  1. C++中explicit关键字的作用

    C++中explicit关键字的作用 explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. ...

  2. C++中const关键字用法详解及实例和源码下载(一)

    最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识.现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲 ...

  3. oracle 默认escape_ORACLE中ESCAPE关键字用法

    ORACLE 中 ESCAPE 关键字用法 2012-09-19 00:00 比特网悠虎 关键字: 定义: escape 关键字经常用于使某些特殊字符,如通配符: '%','_' 转义为它们原来的 字 ...

  4. C++中的explicit关键字用法

    c++中的explicit关键字用来修饰类的构造函数,被修饰的类的构造函数不能进行隐式类型的转换,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐 ...

  5. MySQL中的关键字用法(二)

    MySQL中的关键字的用法(二) limit:偏移量和数量 注意limit和offset的区别,下面有写到offset,注意区分: 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时 ...

  6. C++ 中explicit关键字详解

    展开 explicit关键字的作用 使用情况 类型转换函数 单操作数构造函数 同时出现拷贝构造函数和类型转换函数 拷贝构造函数 总结 参考文献 explicit关键字的作用 explicit关键字在写 ...

  7. C++ explicit关键字用法详解

    explicit关键字 隐式类类型转换 explicit关键字 隐式类类型转换 在C++语言中,类中的构造函数如果只含有一个参数,默认情况下存在一种隐式转换,即定义了转换为此类类型的隐式转换机制.然而 ...

  8. C++中explicit的用法

    C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用. C++中, 一个参数的构造函数(或者除了第一个参数 ...

  9. oracle中escape关键字用法

    1.使用 ESCAPE 关键字定义转义符.在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符. 2.ESCAPE 'escape_character'  允许在字符串中搜索通配符而不是将其作 ...

最新文章

  1. eltable刷新整个表格方法_Word表格函数计算怎么做?都在这篇!
  2. 微框架spark--api开发利器
  3. python 小例子 源码 莫凡_100 个 Python 小例子(一)
  4. 2017西安交大ACM小学期 选择困难症[折半枚举+二分查找]
  5. C语言,利用条件语句判断数的奇偶性。
  6. java 字符串比较 == equals_Java在比较字符串的时候,equals 与== 完全一样呀?
  7. 华为6p连接计算机设置在哪里设置密码,华为路由器和华为手机如何不用密码连接...
  8. 去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)
  9. VS2017适配版的 VA 安装教程
  10. Mac更新Big Sur或者Monterey后没有管理员账户或当前账户没有管理员权限或rm /var/db/.AppleSetupDone: No such file or directory解决方案
  11. matlab九节点网络仿真问题,三机九节点电力系统仿真matlab
  12. android怎么安装CA证书及代理抓包
  13. 虚拟vpc服务器搭建,服务器搭建vpc
  14. 小象学院python网课值得吗-小象学院Python数据分析第二期【升级版】
  15. APE格式及编解码说明
  16. openwrt wifi 出现missing ACKs和deauthenticated due to inactivity 频繁掉线问题解决方案
  17. Educoder/头歌JAVA——jQuery动画
  18. 【mysql】dump
  19. Cypress 本身启动过程的调试
  20. 从RGB色转为灰度色算法

热门文章

  1. 以下不能在python编译环境_win7 下解决python 集成编译环境IDLE无法打开的问题。...
  2. Linux基本命令-1
  3. php composer 安装,composer安装的方法步骤(图文)
  4. 最短路dijkstra算法详解_最短路径问题---Dijkstra算法详解
  5. sql时间格式转换yyyymm_XML和实体类之间的转换
  6. 电脑手写输入法_QQ拼音输入法除了能打字,竟然还有 N 多妙用!
  7. linux端口映射_Linux 系统安全与优化配置
  8. STM32 ISP 下载程序, C源码,
  9. 节约里程法java代码_患者,男,70岁,有多年排尿困难,呈淋漓状,近2年来双侧腹股沟区出现半年圆形肿块,站立时明显,平卧后消失,体检时压迫内环肿块仍出现,诊断为...
  10. html怎么建立段落,HTML 段落