美文网首页
C++ 中的 explicit 关键字

C++ 中的 explicit 关键字

作者: madao756 | 来源:发表于2021-11-22 08:56 被阅读0次

    为什么需要 explicit

    想要明白 explicit 就必须得搞清楚「转换函数」这一个基本概念。

    什么是转换函数

    转换函数,就是一个类的成员函数,当编译器发现一个类需要转换成另外一个类的时候,会主动找到对应的转换函数。看下面这个例子:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    class Fraction {
    private:
        int m_numerator;   // 分子
        int m_denominator; // 分母
    public:
        Fraction(int num, int den=1): m_numerator(num), m_denominator(den){}
        operator double() const {
            return double(m_numerator) / m_denominator;
        }
    
    };
    
    int main() {
    
        Fraction f(3, 5);
    
        double d = 4 + f;
    
        cout << d << '\n';
    
        return 0;
    }
    

    一个新问题——如果有多条转换路径会发生什么?

    看下面这个例子:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    class Fraction {
    private:
        int m_numerator;   // 分子
        int m_denominator; // 分母
    public:
        Fraction(int num, int den=1): m_numerator(num), m_denominator(den){}
        Fraction operator+(const Fraction& f) const {
            int an = m_numerator, ad = m_denominator;
            int bn = f.m_numerator, bd = f.m_denominator;
            // an / ad + bn / bd = (an*bd + bn*ad) / ad * bd
            int nn = an*bd + bn*ad, nd = ad * bd;
            // 没有除以最小公倍数
            return Fraction(nn, nd);
        }
        operator double() const {
            return double(m_numerator) / m_denominator;
        }
    
    };
    
    int main() {
    
        Fraction f(3, 5);
    
        Fraction d = f + 4;
    
        cout << d << '\n';
    
        return 0;
    }
    

    这样会报错,有两种转换思路:

    1. 4 转换成 Fraction 两者相加
    2. Fraction f 转换成 double 加上 4 转换成 int,调用 Fraction 的构造函数。

    但是加上 explicit 就会不一样

    explicit 的作用

    主动告诉编译器,只有主动调用构造函数的时候才能使用构造函数。

    
    #include <bits/stdc++.h>
    
    using namespace std;
    
    class Fraction {
    private:
        int m_numerator;   // 分子
        int m_denominator; // 分母
    public:
        explicit Fraction(int num, int den=1): m_numerator(num), m_denominator(den){}
        Fraction operator+(const Fraction& f) const {
            int an = m_numerator, ad = m_denominator;
            int bn = f.m_numerator, bd = f.m_denominator;
            // an / ad + bn / bd = (an*bd + bn*ad) / ad * bd
            int nn = an*bd + bn*ad, nd = ad * bd;
            // 没有除以最小公倍数
            return Fraction(nn, nd);
        }
        operator double() const {
            return double(m_numerator) / m_denominator;
        }
    
    };
    
    int main() {
    
        Fraction f(3, 5);
    
        Fraction d = f + 4;
    
        cout << d << '\n';
    
        return 0;
    }
    

    这样还是会报错,因为只有一条路径:

    1. f 变成 double,4 + double 还是 double。但是 double 不能转换成 Fraction。

    相关文章

      网友评论

          本文标题:C++ 中的 explicit 关键字

          本文链接:https://www.haomeiwen.com/subject/vrwvtrtx.html