【问题标题】:overloading operator -> to access data member重载运算符 -> 访问数据成员
【发布时间】:2014-03-25 20:38:55
【问题描述】:

我对以下关于重载 -> 运算符的示例程序有疑问,在 C++ 教程中也是如此:

 5     class myclass
 6     {
 7         public:
 8         int i;
 9
10         myclass *operator->()
11         {return this;}
12     };
13
14     int main()
15     {
16         myclass ob;
17
18         ob->i = 10;
19         cout << ob.i << " " << ob->i << endl;
20
21         return 0;
22     }

$ ./a.out
10 10

我想了解第 18 行的工作原理。我知道“ob”不是指针,但由于“class myclass”已经定义了运算符“->”,“ob->i”是有效的(在语法上),到目前为止很好。但是,“ob->”返回一个指针,我看不出它是如何被取消引用来访问成员“i”并设置它的。

我假设上面的解释也将解释第 19 行“ob->i”如何打印为 int。

谢谢你, 艾哈迈德。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    operator-&gt; 在链中被调用,直到它不再被调用 - 在你的情况下,它实际上被调用了两次 - 一次是对象上的重载运算符,它返回一个指针,第二次是内置的 - in 运算符取消引用该指针并访问该成员。

    【讨论】:

    • 很好的答案!每天学习一些东西。有没有办法进一步链接它? (例如 -> 返回指向一个对象的点,并且该对象也将它重载到某个东西)
    • @Shingetsu:是的,但它需要operator-&gt; 返回一个对象,而不是指针。然后将调用返回对象的operator-&gt;。只要遇到任何指针,就会触发内置的-&gt; 行为。
    • 您能否详细说明一下,为什么第二次调用内置 -> 运算符。如果您可以逐步扩展第二个 -> 的调用方式/原因。谢谢。
    • @AhmedA 这是标准行为。之后就不多解释了。
    • 我很惊讶程序没有进入无限循环。
    【解决方案2】:

    x-&gt;y 等效于 x.operator-&gt;()-&gt;y 如果 x 是类对象并且找到重载成员 operator-&gt;

    我希望它会变得更清楚。

    【讨论】:

    • 很公平。还有一个问题,当您说“x->y 等同于 x.operator->()->y ...”时,是根据 C++ 语言规范。
    • @AhmedA 好吧,它并不总是等价于那个,但只有当x 是一个类对象并且找到一个重载成员operator-&gt; 时。是的,这是语言规范。
    • 特别是,标准说“当 operator-> 返回时, operator-> 将应用于返回的值,并带有原始的第二个操作数。”
    • 非常感谢您提供详细/支持的答案,太棒了。
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多