Dot operator และ Arrow operator ใช้ทั้งคู่ใน C++ เพื่อเข้าถึงสมาชิกของคลาสหรือโครงสร้าง (struct) พวกมันใช้ในสถานการณ์ที่ต่างกัน ใน C++ ชนิดที่ประกาศเป็น class, struct, หรือ union ถือว่าเป็น "of class type" ดังนั้นต่อไปนี้หมายถึงทั้งสาม
a.bใช้ได้ก็ต่อเมื่อ b เป็นสมาชิกของออบเจกต์ (หรืออ้างอิงถึงออบเจกต์) a ดังนั้นสำหรับ a.b, a จะเป็นออบเจกต์จริง (หรืออ้างอิงถึงออบเจกต์) ของคลาสเสมอa->bเป็น shorthand notation สำหรับ(*a).bกล่าวคือ หาก a เป็น pointer ที่ชี้ไปยังออบเจกต์ a->b จะเข้าถึง property b ของออบเจกต์ที่ a ชี้ไป
โปรดสังเกตว่า dot operator ไม่สามารถโอเวอร์โหลดได้ แต่ -> สามารถโอเวอร์โหลดได้ ดังนั้นเราสามารถกำหนดฟังก์ชันของเราเอง (operator->()) ที่ควรถูกเรียกเมื่อใช้ออเปอเรเตอร์นี้ ดังนั้นถ้า a เป็นออบเจกต์ของคลาสที่โอเวอร์โหลด operator-> (ชนิดทั่วไปคือ smart pointers และ iterators) ความหมายจะเป็น whatever the class designer implemented
References ในเชิงความหมาย คือ aliases ของออบเจกต์ ดังนั้นฉันควรเพิ่ม "or reference to a pointer" เข้าไปด้วย แต่คิดว่าจะทำให้สับสนมากกว่าช่วยได้ เนื่องจาก references to pointers (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