C++编程思想 第1卷 第12章 运算符重载 自动类型转换 运算符转换 反身性

使用全局重载运算符而不用成员运算符的最便利的原因之一是在全局版本中的自动
类型转换可以针对左右任一操作数,而成员版本必须保证左侧操作数已处于
正确的形式。
如果想两个操作数都被转换,全局版本可以节省很多代码

 

//: 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-

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值