[Effective C++] 항목10 : 대입 연산자는 *this의 참조자를 반환하게 하자

Jangmanbo·2023년 3월 20일
0

Effective C++

목록 보기
10/33

대입 연산

int x, y, z;
x = y = z = 15;	// 대입이 사슬처럼 이어진다. 우측 연관 연산!

C++의 대입연산은 여러 개가 사슬처럼 엮일 수 있다.

x = (y = (z = 15));

위의 코드를 풀어쓰면 다음과 같다.
15가 z에 대입되고, 그 대입 연산의 결과(갱신된 z)가 y에 대입, 또 그 대입 연산의 결과(갱신된 y)가 x에 대입된다.


관례에 따른 대입 연산자

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

대입 연산이 사슬처럼 엮이는 것은 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어 있기 때문이다.
대입 연산자는 다음과 같이 구현하는 것이 관례이며, 사용자가 만든 클래스에 대입 연산자가 들어간다면 이 관례를 지키는 것이 좋다.


class Widget {
public:
	...
    Widget& operator+=(const Widget& rhs) // +=, -=, *=도 =대입연산자와 동일한 규약 적용
    {
    	...
        return *this;	// 좌변 객체(의 참조자)를 반환
    }
    
    // 매개변수가 const Widget&이 아닌 int
    Widget& operator=(int rhs) // 대입 연산자의 매개변수 타입이 일반적이지 않은 경우에도 동일한 규약 적용
    {
    	...
        return *this;	// 좌변 객체(의 참조자)를 반환
    }
	...
}

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


관례를 따르지 않더라도 컴파일이 안되거나 하지는 않는다.

그러나 관례는 모든 기본제공 타입들이 따르고 있으며 뿐만 아니라 표준 라이브러리에 속한 모든 타입(string, vector, complex, tr1::shared_ptr)이 따르고 있다. 따라서 굳이 따르지 않을 이유가 없다면 따르는 것이 좋다.

정리
대입 연산자는 관례에 따라 *this의 참조자를 반환하자

0개의 댓글