【问题标题】:Operator '.' vs '->' in C++ [duplicate]操作员 '。' vs C++中的'->' [重复]
【发布时间】:2011-11-12 17:37:36
【问题描述】:

可能重复:
What is the difference between the dot (.) operator and -> in C++?

两者有什么区别?你什么时候用一个代替另一个?

有一次我尝试使用 '->' 而不是 '.'我得到“左操作数有'类'类型,使用'。'”错误,这是什么意思?

【问题讨论】:

    标签: c++


    【解决方案1】:

    . 允许您访问类的成员。以thingy.member 为例。

    如果你有一个指向你的类的指针,比如pThingy,你需要取消引用它才能访问成员。喜欢(*pthingy).member

    取消引用/访问组合的快捷方式是->: pThingy->member

    【讨论】:

      【解决方案2】:

      所有这些答案在狭窄的范围内都是正确的。即使没有指针,也可以使用 -> 运算符,因为可以重载它。看看智能指针:

      class A
      {
          public:
             void foo();
      }
      
      class SmartPtr
      {
      public:
          SmartPtr (A& obj)
          {
              instance = obj;
          }
          A instance;
          A operator-> ()
          {
              return instance;
          }
      };
      

      那么你可以这样做:

      A a;
      SmartPtr smart(a);
      smart->foo();
      

      所以你可以使用 -> 即使 SmartPtr 不是指向 SmartPtr 类型对象的指针。

      此答案是对先前答案的补充,因为它们可能具有误导性。在一个简单的情况下,它们都是正确的。请注意,dot(.) 运算符不能重载。

      【讨论】:

        【解决方案3】:

        . 在对象是T 类型时使用。 -> 如果对象是 T* 类型。

        class foo {};
        
        foo obj;
        

        obj 类型为foo,它位于堆栈上。因此,要访问它的成员,需要使用 . 运算符。

        foo *hObj = new foo();
        

        hObj 是一个指向对象的指针。因此,要访问它的成员,需要使用 -> 运算符。

        【讨论】:

          【解决方案4】:

          您使用object.property 来获取对象的属性。但是,如果您有一个指向对象的指针(我们称之为pointer_to_object),那么您将使用-> 来访问它的属性:pointer_to_object->property

          您收到错误的原因是因为语句pointer_to_object->property 将首先尝试取消对实际对象的引用,然后访问其属性。如果变量不是指向对象的指针,则会出现错误。

          【讨论】:

            【解决方案5】:

            x->blah 是写(*x).blah 的一个很好的原因。那就是它取消引用一个指针,然后访问成员blah。如果 x 不是指针,则表示编译时错误。

            【讨论】:

              【解决方案6】:

              如果 a 是指针(或提出“指针语义”的对象),则认为 a->b(*a).b

              更一般地说,如果a 不是一个指针,它们是两个运算符:-> 是可覆盖的(所以它的作用取决于它应用的类,注意 class 作为一种类型,而不是指向类的指针:见上文),另一个是不可覆盖的成员选择(对非复合类型无意义),所以 a->b 表示 “通过调用 A::operator->() 返回的指针访问 b 成员 a, 而a.b 表示“访问ab 成员”

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-11-15
                • 2011-05-10
                • 2011-01-01
                • 2017-09-08
                • 2015-12-24
                • 1970-01-01
                相关资源
                最近更新 更多