Toán tử chấm và mũi tên đều dùng trong C++ để truy cập thành viên của lớp. Chúng chỉ dùng trong 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).
a.bchỉ dùng nếublà thành viên của đối tượng (hoặc tham chiếu đến đối tượng)a. Vậy vớia.b,aluôn là đối tượng thực tế (hoặc tham chiếu đến đối tượng) của một lớp.a->bvề bản chất là ký hiệu tắt cho(*a).b, tức là nếualà con trỏ đến đối tượng, thìa->btruy cập thuộc tínhbcủa đối tượng màatrỏ tới.
Lưu ý . không thể nạp chồng (overload). -> là toán tử có thể nạp chồng, nên ta có thể định nghĩa hàm operator->() được gọi khi dùng toán tử này. Vì vậy nếu a là đối tượng của lớp nạp chồng operator-> (kiểu phổ biến: smart pointers, iterators), thì ý nghĩa là do người thiết kế lớp triển khai.
[1] Tham chiếu về mặt ngữ nghĩa là bí danh của đối tượng, nên tôi nên thêm "hoặc tham chiếu đến con trỏ" vào mục #3. Tuy nhiên, tôi nghĩ điều này sẽ gây nhầm lẫn hơn là hữu ích, vì tham chiếu đến con trỏ (T*&) hiếm khi dùng.
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ả
5 5