此时就不需要重载全局操作符+。
首先是检查有没有全局重载对应的+,没有找到,再调用转换函数,如果没有则报错,有的调用其进行隐式转换。
转换函数语法:
返回类型就是double,所以不用写。
所以转换函数不用写返回类型。
另外呢,一般都加const(建议加)。(当然不加也可以编译通过)
注:上图中的转换函数有问题,应该先将分子分母转成double再运算返回:
#include <iostream>
using namespace std;
class Fraction{
public:
Fraction(int m,int n):_m(m),_n(n){
}
operator double() const {
return (double(_m)/double(_n));
}
private:
int _m;
int _n;
};
int main() {
Fraction a(3,5);
double b=4+a;
cout<<b<<endl;
return 0;
}
形式:
operator 类型名() const{
// 函数体
return 对应的类型;
}
non_explicit-one-argument ctor
不写返回类型,const成员函数。
另外呢,下图这种构造函数称为:非- explicit -一个实参 的构造函数(有一个默认参数)
2 parameters(argument指的实参,parameter指的形参)
(Explicit 明确的)
有何特性?
这里没有定义转换函数。
首先找有没有+这个动作,没有严格的重载函数,所以做调用构造函数把4转成Fraction类型,再调用operator+
二者并存
编译器就不知道该怎么办呢。歧义。二者都可行,并且没有哪一种更好(优先级)。
1、先调用double把f转成double,加法结果为double,再把double转成Fraction、
2、或者 : 调用非explicit的一个实参的 构造函数 把4 转成Fraction,再调用operator+;
explicit
现在加上构造函数前加上explicit。那么(单个实参的)构造函数就不能用于把 单个实参 隐式转成
此Fraction类。
这时候就会报错,因为+重载时两边都是Fraction类对象,而构造函数explicit无法转换了。
注:此时d2是Fraction对象,而不是先前的double。
此时,先前的两种歧义行为:
1、先调用double把f转成double,加法结果为double,再调用 非explicit构造函数把double转成Fraction、
2、或者 : 调用非explicit的一个实参的 构造函数 把4 转成Fraction,再调用operator+;
由于构造函数是explicit,所以歧义1和2不能成立(因为都要调用非explicit构造函数)。
所以这个关键字,99%的情况下都是用在构造函数前面。用来避免隐式转换(可能与内部的转换函数发生歧义导致错误)。