14.7 成员访问运算符
添加解引用运算符*
和箭头运算符->
class StrBlobPtr {
public:
string& operator*() const {
auto p = check(curr, "dereference past end");
return (*p)[curr]; // (*p)是对象所指的vector
}
string* operator->() const {
return &this->operator*();
}
};
箭头运算符必须是类的成员,解引用运算符通常也是类的成员
StrBlob a1 = {"hi", "bye", "now"};
strBlobPtr p(a1); // p指向a1中的vector
*p = "okay";
cout << p->size() << endl; // 4
cout << (*p).size() << endl; // 4
对箭头运算符返回值的限定
对于point->mem
有两种情况
(*point).mem;
point.operator->mem;
- 如果
point
是指针,等价于(*point).mem
,先解引用,再访问成员 - 如果是定义了
operator->
的类对象,则使用point.operator->()
的结果获取mem
,如果该结果是一个指针,则执行第1步;如果该结果本身含有重载的operator->()
,则重复调用当前步骤
重载的箭头运算符必须返回类的指针或者自定义了箭头运算符的某个类的对象
如果是指向对象的指针,则可以直接使用->
访问成员函数或变量
如果是对象,并且重载了箭头运算符,就可以用箭头运算符获得对象的指针,再用指针的方式去访问
class A {
public:
void fun() { cout << "hello A" << endl; }
A* operator->() { return this; }
};
int main() {
A *pa = new A();
pa->fun(); // 指针直接调用
A a;
a.fun();
a.operator->()->fun(); // 通过重载箭头运算符调用
a->fun(); // 等价
return 0;
}