Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 점(.) 연산자와 화살표(->) 연산자의 차이점 완벽 정리

C++에서 점(.) 연산자화살표(->) 연산자는 모두 클래스의 멤버에 접근할 때 사용됩니다. 다만 두 연산자는 서로 다른 상황에서 사용된다는 차이가 있습니다. C++에서는 class, struct, union으로 선언된 타입을 모두 "클래스 타입(class type)"으로 간주하므로, 아래 설명은 이 세 가지 타입 모두에 해당합니다.

  • a.b는 b가 객체 a(또는 객체에 대한 참조)의 멤버일 때만 사용할 수 있습니다. 즉, a.b에서 a는 항상 클래스의 실제 객체이거나 객체에 대한 참조여야 합니다.
  • a->b는 본질적으로 (*a).b의 축약 표현입니다. 즉, a가 객체를 가리키는 포인터라면, a->b는 a가 가리키는 객체의 멤버 b에 접근하는 것입니다.

한 가지 주목할 점은 점(.) 연산자는 오버로딩이 불가능하다는 것입니다. 반면 화살표(->) 연산자는 오버로딩이 허용되므로, 이 연산자가 사용될 때 호출될 동작을 operator->() 함수로 직접 정의할 수 있습니다. 따라서 a가 operator->를 오버로드한 클래스의 객체라면(대표적인 예로 스마트 포인터(smart pointer)와 반복자(iterator)가 있습니다), 그 의미는 해당 클래스 설계자가 구현한 방식에 따라 결정됩니다.

[참고] 참조(reference)는 의미상 객체의 별칭(alias)이므로, 엄밀하게 말하면 "포인터에 대한 참조"의 경우도 고려해야 합니다. 다만 포인터에 대한 참조(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;
}

위 코드에서 a는 실제 객체이므로 점(.) 연산자로 멤버에 접근하고, x는 객체 a의 주소를 담고 있는 포인터이므로 화살표(->) 연산자를 사용합니다.

실행 결과

위 코드를 실행하면 다음과 같은 출력을 얻습니다.

5
5

두 연산자 모두 같은 멤버 변수 b의 값인 5에 성공적으로 접근한 것을 확인할 수 있습니다.

핵심 요약

  • 점(.) 연산자: 객체 자체 또는 객체에 대한 참조의 멤버에 접근할 때 사용하며, 오버로딩이 불가능합니다.
  • 화살표(->) 연산자: 객체를 가리키는 포인터를 통해 멤버에 접근할 때 사용하며, 오버로딩이 가능합니다.
  • a->b(*a).b와 완전히 동일한 의미입니다.