预测下面C++程序的输出:

#include <iostream> 

using namespace std; 

class Complex
{
private:
double real;
double imag; public:
// Default constructor
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {} // A method to compare two Complex numbers
bool operator == (Complex rhs) {
return (real == rhs.real && imag == rhs.imag)? true : false;
}
}; int main()
{
// a Complex object
Complex com1(3.0, 0.0); if (com1 == 3.0)
cout << "Same";
else
cout << "Not Same";
return ;
}

输出:编译通过,产生输出。

Same

在C++中,如果一个类有一个可以用单个参数调用的构造函数,那么这个构造函数就变成了转换构造函数,因为这样的构造函数允许将单个参数转换成正在构造的类。 我们可以避免这种隐式转换,因为这可能会导致意想不到的结果。我们可以借助explicit使构造函数显式化。例如,如果我们尝试下面的程序,在构造函数中使用显式关键字,我们会得到编译错误。
#include <iostream> 

using namespace std; 

class Complex
{
private:
double real;
double imag; public:
// Default constructor
explicit Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {} // A method to compare two Complex numbers
bool operator== (Complex rhs) {
return (real == rhs.real && imag == rhs.imag)? true : false;
}
}; int main()
{
// a Complex object
Complex com1(3.0, 0.0); if (com1 == 3.0)
cout << "Same";
else
cout << "Not Same";
return ;
}

输出:编译错误。

no match for 'operator==' in 'com1 == 3.0e+0'

我们仍然可以将double类型转换为Complex类型,但是现在我们必须要明确对它进行类型转换。例如,下面这个程序就工作正常。

#include <iostream> 

using namespace std; 

class Complex
{
private:
double real;
double imag; public:
// Default constructor
explicit Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {} // A method to compare two Complex numbers
bool operator== (Complex rhs) {
return (real == rhs.real && imag == rhs.imag)? true : false;
}
}; int main()
{
// a Complex object
Complex com1(3.0, 0.0); if (com1 == (Complex)3.0)
cout << "Same";
else
cout << "Not Same";
return ;
}

输出:编译通过,产生输出。

Same

 
 

C++:关键字explicit的用法的更多相关文章

  1. C++关键字 explicit

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

  2. C++ 关键字 explicit, export, mutable

    转自 explicit 如果A类有某个构造函数的单个输入参数,是B类(包括基本数据类型)的对象或引用,则C++的编译器会在需要A类形参的函数调用中,自动调用该构造函数,将B类实参隐式地转换为A类实参. ...

  3. js之字面量、对象字面量的访问、关键字in的用法

    一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...

  4. 关键字explicit

    今天在<C++ Standard Library>中看到 explicit 的作用,在这里做一下笔记,以备下次再次忘记该关键字的作用. By using the keyword expli ...

  5. Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

    最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前 ...

  6. C# 显式转换关键字 explicit

    不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...

  7. c/c++拷贝构造函数和关键字explicit

    c/c++拷贝构造函数和关键字explicit 关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象:不加就可以隐式初始化对象: 下面的代码是可以正常编译执行的,但 ...

  8. 从Qt谈到C++(一):关键字explicit与隐式类型转换

    转载:果冻虾仁 提出疑问 当我们新建了一个Qt的widgets应用工程时.会自动生成一个框架,包含了几个文件. 其中有个mainwindow.h的头文件.就是你要操纵的UI主界面了.我们看看其中的一段 ...

  9. C++ new的nothrow关键字和new_handler用法

    C++ new的nothrow关键字和new_handler用法 new && new(std::nothrow) new(std::nothrow) 顾名思义,即不抛出异常,当new ...

随机推荐

  1. SolidWorks学习笔记4特征

    绘制斜的拉伸效果 一般拉伸方向垂直于草图基准面, 可以实现绘制一条线,作为其拉伸方向 效果如下 简单孔 在菜单中选择“插入”--“特征”---“简单直孔” 选择一个平面放置 设置好孔的直径和深度后,确 ...

  2. java第一次实验总结&第三周总结

    Java第一次实验报告,java开发环境与简单的Java程序 一.实验目的 1.熟悉JDK开发环境 2.熟练掌握结构化程序设计方法 二.实验内容 打印输出所有的"水仙花数",所谓& ...

  3. [转帖]国产CPU性能最全盘点 宜良性竞争优胜劣汰

    国产CPU性能最全盘点 宜良性竞争优胜劣汰 电子工程专辑的网站内容 其实里面说的不尽全面 比如龙芯和申威就放到一块了 一个是 MIPS 一个是Alpha 明显不一样的东西 x86的应该都不行 而且. ...

  4. 【Python】【demo实验3】【显示素数,显示两个数范围内的所有素数】

    打印两个整数之间的所有素数: (使用平方根来判断  是否应停止验证该数值是否为素数) for i in range(956253526252,9956253526252): k = 1 if i == ...

  5. PTA-迷宫寻路(输出最短路径)

    给定一个M行N列的迷宫图,其中 "0"表示可通路,"1"表示障碍物,无法通行.在迷宫中只允许在水平或上下四个方向的通路上行走,走过的位置不能重复走. 5行8列的 ...

  6. java-selenium定位元素和操作元素

    八种定位方式 一.By.id(id):通过ID 属性查找 HTML 源码 <a onclick="return false;" id="lb" name= ...

  7. 字符串转数组(php版)

    思路: 1.判断当前传来的值是否为数组 2.若不是现将传来的值转换为字符串类型 3.判断当前值是否为空 4.若不为空,采用正则进行匹配,如下图 preg_match('/^{.*?}$/', $str ...

  8. 第一次编译ffmpeg

    今天开始玩ffmpeg了. 从官网下载来的压缩包,不会编译诶,于是我开始研究起来了. 下面就是实时记录的随笔: 首先是从官网下载来的ffmpeg,就是下面这个版本,目前的最新版吧. http://ff ...

  9. Bash Plays with Functions CodeForces - 757E (积性函数dp)

    大意: 定义函数$f_r(n)$, $f_0(n)$为pq=n且gcd(p,q)=1的有序对(p,q)个数. $r \ge 1$时, $f_r(n)=\sum\limits_{uv=n}\frac{f ...

  10. Chrome开发者工具详解(一)之使用断点来调试代码上

    1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断 ...