条款24 若所有参数皆需类型转换,请为此采用non-member函数

/*条款24 若所有参数皆需类型转换,请为此采用non-member函数*/
#include<iostream>
using namespace std;
class Rational{
public:
	Rational(int numerator = 0, int denominator = 1):n(numerator),d(denominator){

	}
	int numerator()const {
		return n;
	}
	int denominator()const{
		return d;
	}
	/*const Rational operator*(const Rational&rhs)const{
		return Rational(n*rhs.n, d*rhs.d);
	}*/
	friend ostream &operator<<(ostream& os, const Rational & rhs);
private:
	int n, d;
};
ostream &operator<<(ostream &os, const Rational & rhs){
	return os << rhs.n << "/" << rhs.d ;
}
const Rational operator*(const Rational&lhs, const Rational&rhs){
	return Rational(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator());//operator* 也不必是Rational的友元函数
}
//问题 :如果你想支持算术运算,定义成non-member or member?
int main(){
	Rational oe(1, 8);
	Rational oh(1, 2);
	Rational res = oh*oe;
	cout << res << endl;
	res = res*oe;
	cout << res << endl;
	res = oh * 2;        /*res = oh.operator*(2) 单参构造
						 如果构造是 explicit 这句也过不了
						 const Rational temp(2)根据2建立一个暂时性的Rataional对象 就等同于res = oh.operator*(temp)
------------
结论:只有当参数被列于参数列内,这个参数才是隐式类型转换的合格参与者 地位相当于“被调用的成员函数所隶属的那个对象”即this对象的那个隐喻参数 绝不是隐式转换的合格参与者
  那么解决的方法就是让operator* 成为一个non-member函数 允许编译器在每一个实参身上执行隐式类型转换
						 */
	//cout << res << endl;
	//res = 2 * oh       // res = 2.operator*(oh) 当然错了
	//res = operator*(2, oh);
	//--------------------------non-member的测试
	res = 2 * oh;
	cout << res << endl;

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值