再次阅读 C++ Primer 5 ed。由 lipmann 现在我已经阅读了有关成员访问运算符重载的信息。一切对我来说都很清楚,除了:
struct A
{
int& operator* () {return *p;}
void foo()const{cout << "A::foo()\n";}
int* p = new int(5);
};
struct B
{
A& operator*(){return a;}
A* operator->(){return &a;}
A a{};
};
struct C
{
B& operator*(){return b;}
B& operator->(){return b;}
B b{};
};
int main()
{
C c;
//cout << *c << endl; // error.
c->foo(); // works
}
我学到的是箭头运算符可以重载,并且必须是成员函数。如果我看到 main 中这样的表达式,
c->foo()
我可以认为它c
是一个内置指针,指向一个类类型的对象,该类类型的成员函数称为foo
fetch 它。或者(如 main 中的情况)c
是定义了自己的类类型的对象->
。因此,因为c
这是一个表达式调用c
箭头运算符的对象,该对象返回一个类B
类型的对象,该对象本身调用其箭头运算符,直到它返回B
对象,该对象->
返回一个指向对象的内置指针A
,在这种情况下,它被取消引用并且结果对象用于获取foo()
功能。所以它递归地调用自己,直到返回一个内置指针并且该指针必须指向一个具有该提取成员的对象。我不明白的是:为什么取消引用运算符的工作方式不同?那么为什么解引用只要返回一个定义了解引用操作符的对象
c
就不会调用*
of等操作符呢?b
请不要争论内存泄漏,
A
目的是为了简洁。