【发布时间】:2020-08-02 04:57:56
【问题描述】:
再次阅读 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的成员函数,因此可以获取它。或者(如 main 中的情况)c是定义了自己的->的类类型的对象。所以因为c这里是一个表达式调用c的箭头运算符的对象,它返回一个类B类型的对象,它本身调用它的箭头运算符,直到它返回B对象,它的->返回一个构建在指向A对象的指针中,在这种情况下,它被取消引用,结果对象用于获取foo()函数。所以它递归地调用自己,直到返回一个内置指针并且该指针必须指向一个具有该提取成员的对象。我不明白:为什么取消引用运算符的工作方式不同?那么为什么解引用
c不调用b的*操作符等等只要返回一个定义了解引用操作符的对象呢?请不要争论
A中的内存泄漏,目的是为了简洁。
【问题讨论】:
标签: c++ operator-overloading member-access