《C++覆辙录》——2.12:晦涩难懂的operator ->

本节书摘来自异步社区出版社《C++覆辙录》一书中的第2章,第2.12节,作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.12:晦涩难懂的operator ->

内建的operator ->是二元的,左手边的操作数是一个指针,右手边的操作数是一个class成员的名字。而重载版本的operator ->则是一元的:

class Ptr{
 public:
  Ptr( T *init);
  T *operator ->();
  // ...
 private:
  T *tp_;
};```
对重载版本的`operator->`的调用,必须返回一个可以用直接或间接地调用内建的`operator->`访问其成员的对象26:

Ptr p( new T );
p->f(); // 表示"p.operator ->()->f()"!`
用某种视角来看,我们可以把实际发生的事理解成词法单位->没有被“吃掉”,而是保留下来“派真正的用场”,如同内建的operator ->一样。典型地,重载版本的operator ->被赋予了一些额外的语义,以支持“智能指针”型别:

T *Ptr::operator ->(){
  if ( today() == TUESDAY ) 
     abort();
  else
     return tp_;
}```
前面说过了,重载版本的operator ->必须返回支持成员访问操作的“某物”。此“某物”并非一定要是个内建的指针。它亦可以是一个重载了``operator ->`的` class`对象:

class AugPtr{
public:
  AugPtr(T *init) : p_(init){}
  Ptr &operator ->();
  // ...
private:
  Ptr p_;
};
1.jpg gotcha24/ptr.cpp

Ptr &AugPtr::operator ->(){
  if (today() == FRIDAY)
    cout<<’a’<  return p_;
}`
这样就可以支持智能指针的级联应用(cascading)了:

AugPtr ap( new T );
ap->f(); // 实际上是"ap.operator ->().operator ->()->f()"!```
请注意,operator ->的调用序列的触发(`activation`)总是由包含`operator ->`定义的对象27静态决定的,而且该调用序列总是终结于返回指涉到`class`对象的内建指针的调用。举个例子,对AugPtr调用operator ->总是会触发以下调用序列:先是调用AugPtr:`:operator->`,接着调用Ptr::operator->,再接着调用T *型别内建指针上的Ptr::`operator->`(若要检视一个更具实践参考意义的例子,请参见常见错误83)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值