变量通过构造函数转换为类对象
class Fraction {
public:
Fraction(int molecular, int denominator = 1) : mMolecular(molecular), mDenominator(denominator){}
Fraction operator + (Fraction& f) {
...
}
private:
int mMolecular;
int mDenominator;
}
Fraction f1(3,5);
Fraction f2 = 4 + f1; //编译器首先通过构造函数把4转换为Fraction的对象然后和f1相加。
如果构造函数前面添加explicit,不允许编译器默认把变量通过构造函数转换为类对象,上面的加法会报错,因为没有整数+类对象的重载函数。
类对象通过重载函数转换为变量
class Fraction {
public:
Fraction(int molecular, int denominator = 1) : mMolecular(molecular), mDenominator(denominator){}
operator double() const { //该重载函数没有返回值类型,函数的名字代表了返回值类型
return (double)(mMolecular /mDenominator);
}
private:
int mMolecular;
int mDenominator;
}
Fraction f1(3,5);
Fraction f2 = 4 + f1;
编译器处理上面的加法:
首先可以把整数转换为Fraction;
寻找Fraction + Fraction的重载函数,没有这样的+重载函数;
编译器寻找将f转换为double类型的转换函数,有这样的转换函数;
进行double + double的加法运算。