item24的适用性不广。大部分时候是不建议使用隐式转换的。了解这个例子对设计类的运算操作符有帮助。运算操作符的实现可以考虑非成员函数实现。
```
class Fraction
{
public:
Fraction(int a, int b) : numerator(a), denominator(b){}
private:
int numerator; int denominator;
}
int main()
{
Fraction a(1,4);
Fraction ret1 = a*2;
Fraction ret2 = 2*a;
}
```
在编译到`Fraction ret1 = a*2;`的时候,编译器实际上编译的是`Fraction ret1=a.operator*(2)`; 如果找不到,它会进一步查`Fraction ret1 = operator*(a,2)` 在这个示例代码中,编译器都找不到,所以会报错。
为了解决这个问题,解决方法1,我们可以给Fraction类定义一个`operator*`,也可以定义一个非成员函数 `const Fraction operator*(const Fraction& lhs, const Fraction&rhs)` 本文推荐使用方式2。 因为方式2可以解决`Fraction ret2= 2* a;`的编译问题。
# 转换函数和操作符重载函数的区别
这里需要区别一下,转换函数和操作符的一些细微区别。 转换函数是不声明返回类型。但是确有return语句。参考隐式转换的学习部分。
网友评论