#include <iostream>
using namespace std;
class Rational
{
public:
Rational(int frist = 0, int second = 1) ;
const Rational operator* (const Rational& rhs)
{
_first *= rhs._first;
_second *= rhs._second;
return *this;
}
void ShowValue(){cout <<this->_first <<endl; cout <<this->_second<<endl;}
private:
int _first;
int _second;
};
Rational::Rational(int frist, int second )
{
_first = frist;
_second = second;
}
int main()
{
Rational a;
Rational b(5,5);
b = 2 *b;
b.ShowValue();
return 0;
}
上述代码中,在执行b = 2*b;时会出现编译错误,提示我们没有定义该方法。
我们在Rational类中定义的*运算符,是因为我们只能把Rational类当做左边的参数,所以我们在2*Rational是会出现编译错误。
解决之法是我们把Rational的*运算当做函数,而不要写成成员函数。
friend const Rational operator* (const Rational& rhs1, const Rational& rhs2);
const Rational operator* (const Rational& rhs1, const Rational& rhs2)
{
Rational tmp;
tmp._first = rhs1._first * rhs2._first;
tmp._second = rhs1._second * rhs2._second;
return tmp;
}
将*运算符声明为Rational的友元函数,然后Rational的*运算参数是两个Rational的引用。
本条款得出的结论如下。假设f是想正确声明的函数,c是和它相关的类:
1、·虚函数必须是成员函数。如果f必须是虚函数,就让它成为c的成员函数2、只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。
3、·其它情况下都声明为成员函数。如果以上情况都不是,让f成为c的成员函数。