常见错误24: 晦涩难懂的operator-> ----读书笔记《c++ gotchas》...
时间:2010-08-07 来源:lzueclipse
内建的operator->是二元的,左操作数是一个指针,右操作数是一个class成员的名字。
而重载版本的operator->则是一元的!
class Ptr {
public:
Ptr(T *init);
T *operator->();
//…
private:
T *tp_;
};
T *Ptr::operator->() {
if(today() == TUESDAY)
abort();
else
return tp_;
}
对重载版本的operator->的调用,必须返回一个可以用operator->访问其成员的对象。//你不想见到Ptr p(new T); p->;
Ptr p(new T);
p->f();//表示p.operator->()->f();
重载版本的operator->必须返回支持成员访问操作的“某物”。此“某物”并非一定要是个内建的指针。它也可以
是一个重载了operator->的class的对象。
class AugPtr {
public:
AugPtr(T *init):p_(init); {}
Ptr &operator-> () ;
//…
private:
Ptr p_;
};
Ptr &AugPtr::operator –> () {
if(today() == FRIDAY)
coutf()
请注意,operator->的调用序列的触发(activation)总是包含operator->之定义的对象静态决定,而且该调用序列
总是终结于返回指向class对象的内建指针的调用。
举个例子:
对AugPtr调用operator->总是触发以下调用序列,
先是调用AugPtr::operator->,
接着调用Ptr::operator->,
再接着调用T*类型内建指针上的Ptr::operator->。