Toán tử chấm (.) và mũi tên (->) đều được dùng trong C++ để truy cập thành viên của một lớp hoặc cấu trúc (struct). Chúng chỉ dùng trong các tình huống khác nhau. Trong C++, các kiểu khai báo là class, struct, hoặc union được coi là "kiểu lớp" (of class type). Vì vậy, sau đây áp dụng cho cả ba.
a.bchỉ dùng nếu b là thành viên của đối tượng (hoặc tham chiếu đến đối tượng) a. Vì vậy, đối với a.b, a luôn là một đối tượng thực tế (hoặc tham chiếu đến đối tượng) của một lớp.a->bvề cơ bản là ký hiệu tắt cho(*a).b, nghĩa là, nếu a là con trỏ đến một đối tượng, thì a->b truy cập thuộc tính b của đối tượng mà a trỏ đến.
Lưu ý rằng toán tử chấm không thể nạp chồng nhưng -> có thể nạp chồng, vì vậy chúng ta có thể định nghĩa hàm riêng operator->() sẽ được gọi khi toán tử này được dùng. Nếu a là đối tượng của một lớp nạp chồng operator-> (kiểu phổ biến là smart pointers và iterators), thì ý nghĩa là bất cứ gì người thiết kế lớp triển khai.
Tham chiếu (references), về mặt ngữ nghĩa, là bí danh của đối tượng, vì vậy tôi nên thêm "hoặc tham chiếu đến con trỏ". Tuy nhiên, tôi nghĩ điều này sẽ gây nhầm lẫn hơn là giúp ích, vì tham chiếu đến con trỏ (T*&) hiếm khi được dùng.
Mã ví dụ
#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;
}
Kết quả đầu ra
5 5