C++ 中的点运算符 (.) 和箭头运算符 (->) 有什么区别?


点运算符和箭头运算符都用于在 C++ 中访问类的成员,只是应用场景不同。在 C++ 中,声明为 class、struct 或 union 的类型都被认为是“类类型”。因此,以下内容都指这三种类型。

  • a.b 仅当 b 是对象 (或对对象的引用[1]) a 的成员时才使用。因此,对于 a.b,a 始终是类的实际对象(或对对象的引用)。
  • a->b 本质上是 (*a).b 的简写,即如果 a 是指向对象的指针,则 a->b 访问的是 a 指向的对象的属性 b。

请注意,. 运算符不可重载。-> 运算符可重载,因此我们可以定义自己的函数 (operator->()),当使用此运算符时应该调用该函数。因此,如果 a 是重载了 operator-> 的类的对象(常见的此类类型是智能指针和迭代器),则其含义由类设计者实现。

[1] 从语义上讲,引用是对象的别名,因此我也应该在 #3 中添加“或指向指针的引用”。但是,我认为这会比有帮助更令人困惑,因为指向指针的引用 (T*&) 很少使用。

示例

#include<iostream>
class A {
   public: int b;
   A() { b = 5; }
};

int main() {
   A a = A();
   A* x = &a;
   std::cout << "a.b = " << a.b << "\n";
   std::cout << "x->b = " << x->b << "\n";
   return 0;
}

输出

这将输出:

5
5

更新于:2020年2月11日

2K+ 次查看

开启你的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.