Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Khác biệt giữa toán tử chấm (.) và mũi tên (->) trong C++

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.b chỉ 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ậy với a.b, a luôn là đối tượng thực tế (hoặc tham chiếu đến đối tượng) của một lớp.
  • a->b về bản chất là ký hiệu tắt cho (*a).b, tức là nếu a là con trỏ đến đối tượng, thì a->b truy cập thuộc tính b của đối tượng mà a trỏ 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