Effective C++ 条款19: 分清成员函数,非成员函数和友元函数

#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的成员函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值