C++ 中的 explicit 關(guān)鍵字

為什么需要 explicit

想要明白 explicit 就必須得搞清楚「轉(zhuǎn)換函數(shù)」這一個基本概念。

什么是轉(zhuǎn)換函數(shù)

轉(zhuǎn)換函數(shù),就是一個類的成員函數(shù),當編譯器發(fā)現(xiàn)一個類需要轉(zhuǎn)換成另外一個類的時候,會主動找到對應的轉(zhuǎn)換函數(shù)??聪旅孢@個例子:

#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;
}

一個新問題——如果有多條轉(zhuǎn)換路徑會發(fā)生什么?

看下面這個例子:

#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;
        // 沒有除以最小公倍數(shù)
        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;
}

這樣會報錯,有兩種轉(zhuǎn)換思路:

  1. 4 轉(zhuǎn)換成 Fraction 兩者相加
  2. Fraction f 轉(zhuǎn)換成 double 加上 4 轉(zhuǎn)換成 int,調(diào)用 Fraction 的構(gòu)造函數(shù)。

但是加上 explicit 就會不一樣

explicit 的作用

主動告訴編譯器,只有主動調(diào)用構(gòu)造函數(shù)的時候才能使用構(gòu)造函數(shù)。


#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;
        // 沒有除以最小公倍數(shù)
        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 不能轉(zhuǎn)換成 Fraction。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容