컴퓨터공학/Effective C++

10. 대입 연산자는 *this의 참조자를 반환하게 하자

Pyxis 2025. 2. 4. 21:09

[ Effective C++ ]

 

C++의 대입 연산은 다음과 같이 여러 번 사슬처럼 엮일 수 있는 성질을 갖고 있다.

int x, y, z;
x = y = z = 15; // x = (y = (z = 15));

 

위 연산은 또한 우측 연관(right-associative) 연산이라는 점인데, 우측에서 부터 대입이 이루어지는 것이다.

이러한 연산이 이루어지게 하려면 "좌변 인자"에 대한 참조자를 리턴하도록 구현해야 한다.

class Widget
{
public:
    ...
    Widget& operator=(const Widget& rhs) // 리턴타입은 현재 클래스에 대한
    {                                    // 참조자
        //...
        return *this; // 좌변 객체의 참조자를 리턴
    }
    ...
};

 

"좌변 객체의 차조자를 반환하게 만들자"라는 규칙은 단순 대입형 연산자 뿐만아니라 모든 형태의 대입 연산자에서도 지켜져야 한다.

class Widget
{
public:
    ...
    Widget& operator+=(const Widget& rhs) // +=, -=. *= 에도 적용
    {
        ...
        return *this;
    }
    
    Widget& operator=(int rhs) // 대입 연산자의 매개변수 타입이
    {                          // 일반적이지 않아도 동일하게 적용한다.
        ...
        return *this;
    }
    ...
};

 

이는 *this을 반환하지 않으면 컴파일이 되지 않는다거나 하는 것은 아니지만, 표준 라이브러리에 속한 함수들도 전부 따르고 있는 "관례"이므로 지키는 것이 좋다.

 

[ 정리 ]

- 대입 연산자는 *this의 참조자를 반환하도록 만들자.