读者可以尝试预言一下这段代码的输出:

  1. #include <iostream>
  2. using namespace std;
  3. class Complex
  4. {
  5. private:
  6. double real;
  7. double imag;
  8. public:
  9. // 默认构造器无explicity关键字
  10. Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
  11.  
  12. // 比较操作符==,接受一个Complex的参数
  13. bool operator == (Complex rhs) {
  14. return (real == rhs.real && imag == rhs.imag)? true : false;
  15. }
  16. };
  17. int main()
  18. {
  19. // a Complex object
  20. Complex com1(3.0, 0.0);
  21. if (com1 == 3.0)//将Complex与double类型比较
  22. cout << "Same";
  23. else
  24. cout << "Not Same";
  25. return ;
  26. }

输出:

  1. Same

上面Complex的==操作符接受的是一个Complex参数。当程序运行到com1 == 3.0时,程序会自动调用Complex的构造器并且传入参数3.0,然后得到一个新的Complex对象,再将这个新对象传给com1的==操作符。所以程序表面上看起来是Complex和double在进行比较,但实际上程序做了隐式的转化(将double转成了Complex),依然是两个Complex在比较。

在C++中如果一个类有能够被单参数所调用的构造器,那么这个构造器就被称为转化构造器——转化构造器允许从单参数到类构造的转化。C++中能够接受单参数的构造器默认都是转化构造器。

那么如何避免这种隐式的转化呢?可以使用explicity关键字。使用了explicity关键字的构造器就不允许上面的隐式转化,要转化的话,只能强制转化。

我们修改后的程序如下:

  1. #include <iostream>
  2. using namespace std;
  3. class Complex
  4. {
  5. private:
  6. double real;
  7. double imag;
  8. public:
  9. // 在构造器上加入explicity关键字
  10. explicit Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
  11.  
  12. // 比较操作符==,接受一个Complex的参数
  13. bool operator== (Complex rhs) {
  14. return (real == rhs.real && imag == rhs.imag)? true : false;
  15. }
  16. };
  17. int main()
  18. {
  19. // a Complex object
  20. Complex com1(3.0, 0.0);
  21.  
  22. //if (com1 == 3.0)//编译错误
  23. if (com1 == (Complex)3.0) //Complex的构造器使用了explicity关键字,就只能进行强制转化了。
  24. cout << "Same";
  25. else
  26. cout << "Not Same";
  27. return ;
  28. }

在案例中,我们可以将double转化为Complex,但是必需强制转化。

下面是一个赋值的案例(Complex的构造器上无 explicity 关键字):

  1. Complex com1(3.0, 0.0);
  2. Complex com2 = 3.0;//将一个3.0赋值给Complex对象

第一个语句是传入参数构造器Complex对象,这没有什么可讨论的。第二个语句将3.0赋值给了Complex对象,其实原理和上面是一样的,首先传入参数3.0到Complex的构造器构造一个临时Complex对象,然后再将临时Complex对象传给com2对象。

如果给Complex构造器加上explicity关键字,那么就变成如下的形式了:

  1. Complex com2 = (Complex)3.0;

原文链接:

https://www.geeksforgeeks.org/g-fact-93/

【C++】C++中explicity关键字的使用的更多相关文章

  1. Java中的关键字 transient

    先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息 ...

  2. js中this关键字测试集锦

    参考:阮一峰<javascript的this用法>及<JS中this关键字详解> this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在 ...

  3. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  4. 【转】java中volatile关键字的含义

    java中volatile关键字的含义   在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  5. 深入解析Javascript中this关键字的使用

    深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFun ...

  6. C/C++中extern关键字解析

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  7. C++中typename关键字的用法

    我在我的 薛途的博客 上发表了新的文章,欢迎各位批评指正. C++中typename关键字的用法

  8. 【有人@我】Android中高亮变色显示文本中的关键字

    应该是好久没有写有关技术类的文章了,前天还有人在群里问我,说群主很长时间没有分享干货了,今天分享一篇Android中TextView在大段的文字内容中如何让关键字高亮变色的文章 ,希望对大家有所帮助, ...

  9. Java中native关键字

    Java中native关键字 标签: Java 2016-08-17 11:44 54551人阅读 评论(0) 顶(23453) 收藏(33546)   今日在hibernate源代码中遇到了nati ...

随机推荐

  1. .NET异步资料收集

    个人认为应该是.NET关于并行编程 / 异步编程最权威的内容来源(虽然看起来里面的内容离现在已经好几年了,但是大部分内容都不过时) https://devblogs.microsoft.com/pfx ...

  2. HttpUtils请求工具类

    package com.cmcc.hybj.payment.framework.https; import java.io.UnsupportedEncodingException;import ja ...

  3. TP5.0使用助手函数model出现\common\Model\类不存在

    在ThinkPHP5.0中有一个助手助手函数model(),可以实例化具体的模型,包括分层模型,只要传入类名(第一个参数),分层名(第二个参数).这个函数其实是ThinkPHP框架Loader中的一个 ...

  4. java Elasticsearch 进行嵌套子聚合

    聚合子查询: TermsAggregationBuilder aggregation = AggregationBuilders.terms("dt_id").field(&quo ...

  5. Linux操作系统之用户权限,重定向,文件管理

    文件的权限 ls -al  ----->隐藏文件会以 .号开头 ls -ld :显示目录自身属性 ls -i 显示文件的索引号----每个文件都有一个对应的号码 ls -r 逆序显示 dr-xr ...

  6. pip换源-换成国内的源

    PyPI使用国内源   通过几次 pip 的使用,对于默认的 pip 源的速度实在无法忍受,于是便搜集了一些国内的pip源,如下: 阿里云 http://mirrors.aliyun.com/pypi ...

  7. PAT 乙级 1012.数字分类 C++/Java

    题目来源 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和, ...

  8. python应用-获取文件后缀名

    def get_suffix(filename,has_dot=False): """ 获取文件后缀名 :param filename: 文件名 :param has_d ...

  9. How do I fix "selector not recognized" runtime exceptions when trying to use category methods from a static library?

    https://developer.apple.com/library/content/qa/qa1490/_index.html A: If you're seeing a "select ...

  10. Word中同样行间距,同样字号,同样字体,但是肉眼看起来行距不一样

    感谢博主转载:https://blog.csdn.net/hongweigg/article/details/47130009 困扰了我好久,直接上解决办法: 然后选择 自定义页边距 选择 无网络(N ...