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+ 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告