美文网首页
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关键字

    C++ explicit用法 C++中的explicit关键字只能用于修饰只有一个参数的类构造函数。 它的作用是表...

  • C++中关键字explicit简析

    C++中关键字explicit的作用 最近学习Qt经常会遇到explicit关键字,那么简单的说一下吧。 在C++...

  • 2020-04-16【explicit】

    explicit关键字详解 C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明...

  • C++ explicit 关键字

    C++ explicit 关键字 最近学习的过程中经常看到explicit这个关键字, 于是去了解了一下. 没好好...

  • C++ explicit

    C++中的explicit

  • C++中的explicit关键字

    转载说明:本作者转载于reference用于自我学习和复查,大家请去reference支持原作者。 首先, C++...

  • C++ 中的 explicit 关键字

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

  • c++ explicit 关键字

    explicit的作用是用来声明类构造函数是显示调用的,而非隐式调用,所以只用于修饰单参构造函数。因为无参构造函数...

  • C++构造函数前面添加explicit关键字的作用

    C++中的 explicit关键字主要是用来修饰类的构造函数,表明该构造函数是显式的,禁止单参数构造函数的隐式转换...

  • explicit

    C++提供了[关键字]explicit,可以阻止不应该允许的经过[转换构造函数]进行的隐式转换的发生。声明为exp...

网友评论

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

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