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