首先是个这样的小数的例子,没加explicit看看是什么情况:

类:

//
// Created by 浅笑 on 2022/11/28.
//
#ifndef CLION_PJ_FRACTION_H
#define CLION_PJ_FRACTION_H
class Fraction{
public:Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}Fraction operator+(const Fraction& f);operator double() const {return (double)m_numerator / m_denominator;}
private:int m_numerator;int m_denominator;friend int gcd(const Fraction& f1, const Fraction f2);
};int gcd(const Fraction& f1, const Fraction f2){int m=f1.m_numerator*f2.m_denominator+f1.m_denominator*f2.m_numerator;int n=f1.m_denominator*f2.m_denominator;int r;while (n!=0){r=m%n;m=n;n=r;}
//    std::cout<<m<<std::endl;return m;
}Fraction Fraction::operator+(const Fraction &f) {int g= gcd(*this,f);int m_num=(m_numerator*f.m_denominator+m_denominator*f.m_numerator)/g;int m_de=(f.m_denominator*m_denominator)/g;
//    std::cout<<m_numerator*f.m_denominator+m_denominator*f.m_numerator<<std::endl;
//    std::cout<<f.m_denominator*m_denominator<<std::endl;return Fraction(m_num,m_de);
}#endif //CLION_PJ_FRACTION_H

测试如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<string>
#include"Fraction.h"using namespace std;int main()
{Fraction f(3,5);Fraction d2=f+4.0;cout<<(double)d2;return 0;
}

之后就炸了:

这里说噢,有二义性:

1.这里的f+4可以用Fraction的+运算符的重载,而这里的操作就是先把4.0由构造函数转变成Fraction类,再用重载的操作符计算。

2.也可以用double的+运算符,操作就是先直接把Fraction用double操作符转过去,再用+号计算,那么我们到底用哪个呢?不知道。

然后我们给类的构造函数加上explicit再测试一次:

explicit Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}

又炸了,不过这次他说的是没有给可见的从double到Fraction的转换,显式的构造函数不是一个候选项,说明啥,我们在加了explicit之后,编译器式不会隐式调用构造函数的!所以这里是两个double相加,那么最后要从double到Fraction,我们就要显式地加上一个构造的函数。

将测试修改如下:

int main()
{Fraction f(3,5);cout<<(double)f<<endl;double ans=f+4.0;cout<<ans<<endl;Fraction d2=f+Fraction(4.0);cout<<(double)d2<<endl;return 0;
}

结果如下所示:

那为啥不Fraction(f+4.0)呢,由于两个数据是int的,所以在初始化的时候把小数给抹去了sos。不过关键还是理解explicit辣!

侯捷C++复现 :explicit在构造函数中相关推荐

  1. 侯捷老师整理||IT专业术语中英对照表

    侯捷老师整理||IT专业术语中英对照表 百度文库的原文,侯捷老师整理的中英单词,真的对我们学习很有帮助 由于老师的网站已经失效了,所以就是从网上搜索来的,没有注明转载. 一群性质相近同的「东西」,如果 ...

  2. [听侯捷演讲]关于IT人士个人发展的一点思索

    导读:文章介绍了侯捷先生的作品书籍,以及侯捷先生的简介,用侯捷先生自己的话来说,他最成功的作品和最受益的作品就是<深入浅出MFC>. 文章内容如下: 最近公司请了stan lippman和 ...

  3. 侯捷-C++面向对象高级开发(头文件与类的声明,构造函数,参数传递与返回值)

    侯捷-C++面向对象高级开发 1.头文件与类的声明 Object Based:面对的是单一的class的设计 Object Oriented:面对的是多重classes的设计,classes和clas ...

  4. 你心目中最难忘的侯捷老师的文章有哪些???

    作者:武龙飞 链接:https://www.zhihu.com/question/30354267/answer/47765817 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. C++构造函数中冒号作用及explicit关键字

    构造函数中冒号作用,类给成员变量赋值,更适用于成员变量的常量const型. class myClass {/*构造函数中冒号作用,类给成员变量赋值,更适用于成员变量的常量const型.*/ publi ...

  6. 侯捷C++八部曲笔记(四、C++2.0新特性)

    侯捷C++八部曲笔记(四.C++2.0新特性) 关键字 noexcept override final decltype =default, =delete nullptr auto explicit ...

  7. 【C++】侯捷C++面向对象高级编程(下)

    转换函数(conversion function) 可以把"这种"东西,转化为"别种"东西. 即Fraction --> double class Fra ...

  8. 侯捷C++课程笔记02: 面向对象高级编程(下)

    本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(下) pdf版本笔记的下载地址: 笔记02_面向对象高级编程(下),排版更美观一点(访问密码:3834) 侯捷C++课程笔记02: 面向对象高 ...

  9. 侯捷C++课程笔记03: STL标准库与泛型编程

    本笔记根据侯捷老师的课程整理而来:STL标准库与泛型编程 pdf版本笔记的下载地址: 笔记03_STL标准库与泛型编程,排版更美观一点(访问密码:3834) 侯捷C++课程笔记03: STL标准库与泛 ...

最新文章

  1. (写给像我一样刚离开校园进入公司的小菜鸟)在领域架构下,如何实现简单的展示页面以及增删改查(第二步)...
  2. 算法导论之红黑树的学习
  3. 计算机二级vb重点知识,计算机二级《VB》历年考试重点知识
  4. 再见,REST,你好,gRPC
  5. C#规范整理·泛型委托事件
  6. Django连接mysql数据库(python3.6)
  7. Fragstats 4.2 批处理(geotiff格式)
  8. 关于函数YEAR、NOW的使用方法以及求年龄的函数公式
  9. window10 Embedded 各分支
  10. 在线计算机微积分,高等数学计算器
  11. 计算机共享wf,电脑怎么共享wifi网络
  12. 外币兑换c语言编程,货币转换 C
  13. Main concerns of fDSST tracker
  14. 苹果IOS开发者账号总结
  15. qt.network.monitor: Could not get the INetworkConnection instance for the adapter GUID.QT关闭时程序异常结束
  16. 桥接路由器总是掉线_tp路由器桥接老掉线怎么办
  17. 1054:分数加减法
  18. ogr 缓冲区_OGR入门.pdf
  19. 10.1 做一个全面发展的大学生——《逆袭大学》连载
  20. 浅谈自动化测试中的验证码处理方法小总结

热门文章

  1. 像素坐标转换为世界坐标
  2. 计算机的数学知识的手抄报图片大全,关于数学手抄报图片大全
  3. java-php-python-ssm日租房管理系统计算机毕业设计
  4. RxJava2.X 源码分析 一
  5. mysql中复合索引语法_MySQL 复合索引
  6. STM32的TAMPER-RTC管脚作为Tamper使用 - 防拆机
  7. 二、训练yolox模型
  8. matlab 图像上画椭圆 保持原来图像分辨率
  9. 使用node环境创建vue项目
  10. 使用opencv开发视频播放器一