Effective C++ Item 24 若所有参数皆需类型转换,请为此采用non-member函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


经验:如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻函数)进行类型转换,那么这个函数必须是个non-member

示例:operator *是member函数的情况

#include <iostream>
#include <string>
using namespace std;

class Rational{
public:
	Rational(int nn = 0, int dd = 1): n(n), d(dd){}
	const Rational operator* (const Rational &rhs) const{return Rational(n * rhs.n, d * rhs.d);};
	int numerator() const{return n;}
	int denominator() const {return d;}
private:
	int n, d;
};



int main(){
	Rational oneHalf(1, 2);
	Rational result;
	result = oneHalf * 2; // ok
	result = 2 * oneHalf; // error C2677: 二进制“*”: 没有找到接受“Rational”类型的全局运算符(或没有可接受的转换)
	system("pause");
}

解析:

result= oneHalf * 2 等价于 result = oneHalf.operator*(2); 而int类型的2会被隐式类型转换为Rational类型

result= 2 * oneHalf 等价于 result = 2.operator*(oneHalf); 而int类型的并没有相应的class,也就没有operator*函数

纠正:让operator*成为non-member函数

#include <iostream>
#include <string>
using namespace std;

class Rational{
public:
	Rational(int nn = 0, int dd = 1): n(n), d(dd){}
	int numerator() const{return n;}
	int denominator() const {return d;}
private:
	int n, d;
};

const Rational operator* (const Rational &lhr, const Rational &rhs) 
{
	return Rational(lhr.numerator() * rhs.numerator(), lhr.numerator() * rhs.denominator());
};
int main(){
	Rational oneHalf(1, 2);
	Rational result;
	result = oneHalf * 2;
	result = 2 * oneHalf;
	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值