使用全局重载运算符而不用成员运算符的最便利的原因之一是在全局版本中的自动
类型转换可以针对左右任一操作数,而成员版本必须保证左侧操作数已处于
正确的形式。
如果想两个操作数都被转换,全局版本可以节省很多代码
//: C12:ReflexivityInOverloading.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
class Number {
int i;
public:
Number(int ii = 0) : i(ii) {}
const Number
operator+(const Number& n) const {
return Number(i + n.i);
}
friend const Number
operator-(const Number&, const Number&);
};
const Number
operator-(const Number& n1,
const Number& n2) {
return Number(n1.i - n2.i);
}
int main() {
Number a(47), b(11);
a + b; // OK
a + 1; // 2nd arg converted to Number
//! 1 + a; // Wrong! 1st arg not of type Number
a - b; // OK
a - 1; // 2nd arg converted to Number
1 - a; // 1st arg converted to Number
} ///:~
类Number有一个成员operatpr+和一个friend operator-。因为有一个使用单一
int参数的构造函数,在正确的条件下,int可以自动转换为Number
对于friend operator-,编译器需要填满两个参数,它不是限定Number作为
左侧参数
编译器就使用构造函数把第一个参数转换为Number
编译器不会把表达式1-1的两个参数转换为Number对象,然后调用operator-