C++
里,对于一个类对象a
,它的->
操作展开为:(a.operator->())->...
,即对operator->
返回的对象继续调用->
,直到得到一个原始结构体或数据指针为止。
test.cpp
#include <iostream>
struct Data {
int a;
int b;
};
class A {
public:
A(const Data &d) : data_(d) {}
Data *operator->()
{
std::cout << "A::operator->()" << std::endl;
return &data_;
}
private:
Data data_;
};
class B {
public:
B(const A &a) : a_(a) {}
A operator->()
{
std::cout << "B::operator->()" << std::endl;
return a_;
}
private:
A a_;
};
int main()
{
Data data{1, 2};
A objA(data);
B objB(objA);
std::cout << objB->a << std::endl;
std::cout << objB->b << std::endl;
return 0;
}
运行结果如下:
objB->a
等价于((objB.operator->()).operator->())->a
。
objB->b
等价于((objB.operator->()).operator->())->b
。