天天看点

C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符

如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题。

如果a是一种类型,表达式 a sym b 可能是:

//不能通过调用形式来区分当前调用的是成员函数还是非成员函数

a.operatorsym(b); //a有一个operatorsym 成员函数

operatorsym(a,b); //operatorsym 是一个普通函数

eg.

class SmallInt{
	friend SmallInt operator + (const SmallInt&,const SmallInt&);
public:
	SmallInt(int = 0);
	operator int() const {return val;}
private:
	std::size_t val;
};

SmallInt s1,s2;
SmallInt s3 = s1 + s2;	//使用重载的 operator+
//二义性错误,可以把0转换成 SmallInt,然使用 SmallInt 的 +;
//或者把 s3 转换成 int,然后对于两个 int 执行内置的加法。
int i = s3 + 0;		
           
  • 表达式中运算符的候选函数集既包括成员函数,也包括非成员函数。
  • 当使用重载运算符作用于类类型的对象时,候选函数中包含了该运算符的普通非成员版本和内置版本。除此之外,如果左侧运算对象是类类型,则定义在该类中的运算符的重载版本也包含在候选函数内。

【引用】

[1] 代码classTypeExchange.h