【问题标题】:difference between -> and . for member selection operator [duplicate]-> 和 之间的区别。对于成员选择运算符 [重复]
【发布时间】:2011-03-02 10:52:29
【问题描述】:

可能重复:
what is the difference between (.) dot operator and (->) arrow in c++

在这本书中,我正在学习指针,我刚刚完成了关于 OOP(吐在地上)的章节,它告诉我我可以使用这样的成员选择运算符( -> )。它说这就像“。”除了指向对象而不是成员对象。有什么区别,好像用的一样……

【问题讨论】:

标签: c++ class operators


【解决方案1】:

地点:

Foo foo;
Foo* pfoo = &foo;

pfoo->mem 在语义上与(*pfoo).mem 相同。

或者,换一种说法:foo.mem 在语义上与(&foo)->mem 相同。

【讨论】:

  • 语义相同。如果它是相同的标记序列,它将在语法上相同:)
  • foo.mem === (*(&foo)).mem :-)
  • 这间接令人困惑,因为您的示例中的一些 foo 是指针,而其他的是对象。
  • 我解决了所有迂腐的嘘声吗?
  • 不完全是:operator-> 和一元 operator*operator& 可以重载,但 operator. 不能。因此,仅当 pfoo 是指针时,您的等价性才必然成立。支持您陈述的表达式的其他类型可能会或可能不会将运算符实现为等效。你确实问过;-)
【解决方案2】:

是的,它实际上做了同样的事情,只是针对不同类型的变量。

如果你有一个指针,你必须使用->,而如果你有一个真正的值,你将使用.

例如

struct mystruct *pointer;
struct mystruct var;

pointer->field = ...
var.field = ...

这一点都不难。请记住,如果有指针,则需要->,否则需要.

【讨论】:

  • 非常感谢。我是这么想的,但我现在的想法是布丁。因此,如果该行中有一个指针,请使用 -> 或者使用 .
【解决方案3】:

只有在变量是指向对象的指针时才使用 ->:

A* a = new A;
a->member();

使用“。”当它不是指针时:

A a;
a.member();

【讨论】:

    【解决方案4】:
    struct S
    {
        int a, b;
    };
    
    S st;
    S* pst = &st;
    st.a = 1;    // . takes an object (or reference to one)
    pst->b = 2;  // -> takes a pointer
    

    【讨论】:

      【解决方案5】:

      当您拥有一个对象实例 (MyObject object;) 时,您可以使用 . 来访问它的成员(方法、属性、字段等),例如:object.Member

      当您有一个指向对象实例的指针 (MyObject* pObject = new MyObject();) 时,您需要取消对指针的引用,然后才能访问对象成员。要取消引用指针,请使用 * 运算符。因此,当你将两者结合起来时,你会得到这样的结果:(*pObject).Member

      当然,这是不可读的,所以编译器将-> 作为它的简写。因此,它变成了pObject->Member

      【讨论】:

        【解决方案6】:

        也许这个例子会有所帮助

        object o;
        object *p = &o;  // pointer to object
        o.member;   // access member
        p->member;  // access member through pointer
        

        【讨论】:

          【解决方案7】:

          你使用->取消引用指针,当你通过指针访问成员时,你使用.直接访问成员。

          class A
          {
             public:
             int x;
             void g() {};
          };
          
          A a;
          a.x
          a.g();
          
          A * ap = new A();
          ap->x;
          ap->g();
          

          你可以取消引用指针然后使用.:

          (*ap).x;
          (*ap).g();
          

          【讨论】:

            猜你喜欢
            • 2010-12-30
            • 1970-01-01
            • 1970-01-01
            • 2022-01-19
            • 1970-01-01
            • 2013-05-16
            • 2014-03-28
            • 2021-12-18
            相关资源
            最近更新 更多