• 侯捷C++复现 :explicit在构造函数中


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

    类:

    1. //
    2. // Created by 浅笑 on 2022/11/28.
    3. //
    4. #ifndef CLION_PJ_FRACTION_H
    5. #define CLION_PJ_FRACTION_H
    6. class Fraction{
    7. public:
    8. Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}
    9. Fraction operator+(const Fraction& f);
    10. operator double() const {
    11. return (double)m_numerator / m_denominator;
    12. }
    13. private:
    14. int m_numerator;
    15. int m_denominator;
    16. friend int gcd(const Fraction& f1, const Fraction f2);
    17. };
    18. int gcd(const Fraction& f1, const Fraction f2){
    19. int m=f1.m_numerator*f2.m_denominator+f1.m_denominator*f2.m_numerator;
    20. int n=f1.m_denominator*f2.m_denominator;
    21. int r;
    22. while (n!=0){
    23. r=m%n;
    24. m=n;
    25. n=r;
    26. }
    27. // std::cout<
    28. return m;
    29. }
    30. Fraction Fraction::operator+(const Fraction &f) {
    31. int g= gcd(*this,f);
    32. int m_num=(m_numerator*f.m_denominator+m_denominator*f.m_numerator)/g;
    33. int m_de=(f.m_denominator*m_denominator)/g;
    34. // std::cout<
    35. // std::cout<
    36. return Fraction(m_num,m_de);
    37. }
    38. #endif //CLION_PJ_FRACTION_H

    测试如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include"Fraction.h"
    13. using namespace std;
    14. int main()
    15. {
    16. Fraction f(3,5);
    17. Fraction d2=f+4.0;
    18. cout<<(double)d2;
    19. return 0;
    20. }

    之后就炸了:

     这里说噢,有二义性:

    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,我们就要显式地加上一个构造的函数。

    将测试修改如下:

    1. int main()
    2. {
    3. Fraction f(3,5);
    4. cout<<(double)f<
    5. double ans=f+4.0;
    6. cout<
    7. Fraction d2=f+Fraction(4.0);
    8. cout<<(double)d2<
    9. return 0;
    10. }

    结果如下所示:

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

  • 相关阅读:
    台湾SSS鑫创SSS1700替代Cmedia CM6533 24bit 96KHZ USB音频编解码芯片
    C/C++读取SEGY文件(三)
    MH/T 6040航空材料烟密度试验
    win10磁盘分区解决方案
    七、python ConfigParser模块
    国金证券DevOps建设项目分享——嘉为蓝鲸
    [附源码]SSM计算机毕业设计小锅米线点餐管理系统JAVA
    笔试题 键盘 车队
    下一代英伟达H100 GPU发布时,国产芯片能追上吗?
    第二证券|多只公募基金损失惨重;储能板块低开高走
  • 原文地址:https://blog.csdn.net/weixin_46266058/article/details/128086926