점 및 화살표 연산자는 모두 C++에서 클래스 또는 구조체의 멤버에 액세스하는 데 사용됩니다. 이들은 단지 다른 시나리오에서 사용됩니다. C++에서 클래스, 구조체 또는 공용체로 선언된 형식은 "클래스 형식"으로 간주됩니다. 따라서 다음은 이 세 가지를 모두 나타냅니다.
-
a.b는 b가 객체의 구성원(또는 객체에 대한 참조)인 경우에만 사용됩니다. 따라서 a.b의 경우 항상 클래스의 실제 객체(또는 객체에 대한 참조)가 됩니다.
-
a->b는 본질적으로 (*a).b의 약식 표기법입니다. 즉, a가 객체에 대한 포인터이면 a->bis가 가리키는 객체의 속성 b에 액세스합니다.
점은 오버로드될 수 없지만 ->는 오버로드될 수 있으므로 이 연산자가 사용될 때 호출되어야 하는 자체 함수(operator->())를 정의할 수 있습니다. 따라서 operator->를 오버로드하는 클래스의 개체인 경우(일반적인 유형은 스마트 포인터와 반복자입니다) 의미는 클래스 디자이너가 구현한 모든 것입니다.
참조는 의미상 개체에 대한 별칭이므로 "또는 포인터에 대한 참조"도 추가했어야 했습니다. 그러나 포인터(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