【C++の相关概念】operator->重载

代码实例

operator->重载不同于其他的重载运算符,接下来将用两个例子来说明:

class A
{
 public:
     int i;
    A(){i = 100;} 
    void print( int a){printf("%d/n", a);}
    A* operator->(){ return this;}
};
int main()
{
     int ret;
     A a;
     ret = a->i;
    a->print(200);
}

以上代码的正确执行顺序是:首先a->返回&a,接着&a->print(200);,相当于执行a.point(200);

#include <iostream>
#include <vector>
using namespace std;
 
class Obj {
  static int i, j;
public:
  void f() const { cout << i++ << endl; }
  void g() const { cout << j++ << endl; }
};
 
// Static member definitions:
int Obj::i = 47;
int Obj::j = 11;
 
// Container:
class ObjContainer {
  vector<Obj*> a;
public:
  void add(Obj* obj) { a.push_back(obj); }
  friend class SmartPointer;
};
 
class SmartPointer {
  ObjContainer& oc;
  int index;
public:
  SmartPointer(ObjContainer& objc) : oc(objc) {
    index = 0;
  }
  // Return value indicates end of list:
  bool operator++() { // Prefix
    if(index >= oc.a.size()) return false;
    if(oc.a[++index] == 0) return false;
    return true;
  }
  bool operator++(int) { // Postfix
    return operator++(); // Use prefix version
  }
  Obj* operator->() const {
    return oc.a[index];
  }
};
 
int main() {
  const int sz = 10;
  Obj o[sz];
  ObjContainer oc;
  for( int i = 0; i < sz; i++)
    oc.add(&o[i]); // Fill it up
  SmartPointer sp(oc); // Create an iterator
  do {
   sp->f(); // Pointer dereference operator call
    sp->g();
  } while(sp++);
}

以上代码摘自《thinking in C++》,ObjContainer就是一个容器类或者说是指针数组,保存了Obj变量,而SmartPointer是一个ObjContainer的迭代器,int main()代码描述了往oc容器类中添加Obj变量,并且利用迭代器sp遍历容器类,执行Obj的f()和g()函数。sp->f();执行过程如下:
    首先sp->返回oc.a[index],然后oc.a[index]->f();

总结

重载->运算符一定是一个成员函数,它有额外的、非典型的限制:它必须返回一个对象(或对象的引用),该对象也有一个重载->运算符的函数;或者必须返回一个指针,被用于选择重载->箭头所指向的内容。

参考

operator->重载问题总结(转)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值