operator->()
说实话这一个小玩意单独拿出来做一章有点小题大做,所以这篇文章相对会比较短
还是,希望给大家第一手的信息,而不是我嚼过的
在搜集资料的过程中,我还发现了->*
和 .*
这样的运算符,他们主要就是指向类成员的指针,无论是成员函数还是成员变量
可以简单的理解为,从右向左看,先解引用,然后在访问成员
具体可以看这里 stackoverflow
现在回到->
这里,重载的operator->()必须是非静态的成员函数,并且是无参数的
如果返回值类型是另一个对象,那么就会递归的进行成员查找,直到最后的返回值是一个指针
看这样一段代码
class Ptr {
X *operator->();
}
Ptr p;
p->m = 10; // (p.operator->())->m;
看到那个转换了吗,返回指针后,他会跟一个->
来进行成员的查找
struct client
{ int a; };
struct proxy {
client *target;
client *operator->() const
{ return target; }
};
struct proxy2 {
proxy *target;
proxy &operator->() const
{ return * target; }
};
void f() {
client x = { 3 };
proxy y = { & x };
proxy2 z = { & y };
std::cout << x.a << y->a << z->a; // print "333"
}
再看这个,就可以理解递归查找的含义了
所以实际上我们使用 z->a
是会变成 ((z.operator->())->operator())->a
所以operator->()
并不会提供具体指向的成员,而只是提供了一个对象以供成员的访问
文章评论