- 基本的带operatr*的类函数(关于operatr在类里面的基本使用:operator重载_zion--6135的博客-CSDN博客)
//*****************仅带函数无具体实现******************** #include <iostream> using namespace std; class Rational { public: //构造函数未设置为explicit,因为我们希望一个int可以隐式转换为Rational Rational(int numerator = 0, int denominator = 1) { ; }; int numerator() const; int denominator() const; const Rational operator*(const Rational &rhs) const { //; // Rational tmp; // return tmp; }; private: //... }; int main() { Rational oneEighth(1, 8); Rational oneHalf(1, 2); Rational result = oneHalf*oneEighth;//正确 result = result*oneEighth; //也正确 return 0; }
- 这没什么问题,就是Rational类调用operator*
- 如果在main中做如下调用,也是ok的,因为Rational的构造函数允许将传参2隐式转换为Rational作为参数。
Rational result = oneHalf * 2; //正确
- 但若做如下调用就是错的:因为2不是一个Rational无法调用operator*
Rational result = 2 * oneHalf; //wrong
- 利用全局函数operator*替换类中的operator*
这个时候就需要把operator*函数作为全局函数来使得2 和 oneHalf作为参数进行操作(关于operator*全局函数:参考operator重载_zion--6135的博客-CSDN博客)便有如下的代码替换Rational类中的operator*函数
const Rational operator*(const Rational& lhs,const Rational& rhs) { return Rational(lhs.numerator()*rhs.numerator, lhs.denominator()*lhs.denominator()); }
- 总结:若所有参数需要转换,需要定义此函数为非meber函数(不太明白这句话意思)