在迭代器类与智能指针类中常常用到解引用运算符(*)和箭头运算符(->)
class StrBlobPtr {
public:
string& operator*() const {
auto p = check(curr, "dereference past end");
return (*p)[curr]; //(*p)是对象所指的vector
}
string* operator->() const {
return &this->operator*(); //将实际工作委托给解引用运算符
}
};
解引用运算符首先检查curr是否仍在作用范围内,如果是,则返回curr所指元素的一个引用。箭头运算符不执行任何自己的操作。而是调用解引用运算符并返回解引用结果元素的地址。
两个运算符定义成了const成员,因为获取一个元素并不会改变StrBlobPtr对象的状态。同时,它们的返回值分别是非常量string的引用或指针,因为一个StrBlobPtr只能绑定到非常量的StrBlob对象。
对于箭头运算符返回值的限定
对于形如point->mem的表达式来说,point必须是指向类对象的指针或者是一个重载了operator->的类的对象。根据point类型不同,point->mem分别等价于:
(*point).mem; //point是一个内置的指针类型
point.operator()->mem; //point是类的一个对象
重载的箭头运算符必须返回类的指针或者自定义了箭头运算符的某个类的对象。
定义一个类令其含有指向StrBlobPtr对象的指针,为这个类定义重载的箭头运算符。
class MyClass {
public:
string* operator->() const {
return ptr->operator->();
}
private:
StrBlobPtr* ptr;
};