More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ operator->()

2021年5月31日 501点热度 0人点赞 0条评论

operator->()

说实话这一个小玩意单独拿出来做一章有点小题大做,所以这篇文章相对会比较短

还是,希望给大家第一手的信息,而不是我嚼过的

stackoverflow

tutorialspoint

cppreference

在搜集资料的过程中,我还发现了->* 和 .* 这样的运算符,他们主要就是指向类成员的指针,无论是成员函数还是成员变量

可以简单的理解为,从右向左看,先解引用,然后在访问成员

具体可以看这里 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->()并不会提供具体指向的成员,而只是提供了一个对象以供成员的访问

标签: 暂无
最后更新:2021年5月31日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS