대입 연산자는 *this의 참조자를 반환하게 하자
내용
대입 연산자의 반환 값
C++의 대입 연산은 여러 개가 사슬처럼 엮일 수 있는 성질을 가지고 있다.
1
2
int x, y, z;
x = y = z = 15; // 대임이 사슬처럼 이어진다.
대입 연산이 가진 또 하나의 특성은 바로 우측 연관(right-associative) 연산이라는 점이다.
1
x = ( y = ( z = 15));
위와 같이 대입 연산이 사슬처럼 엮이려면 대입 연잔자가 좌변 인자에 대한 참조자를 반환하도록 구현되어 있을 것이다. 이러한 구현은 일종의 관예(convention)인데, 이는 프로그래머가 만드는 클래스에 대입 연산자가 혹시 들어간다면 이를 따르는 것이 좋다.
1
2
3
4
5
6
7
8
9
10
class Widget {
public;
...
// 반환 타입은 현재의 클래스에 대한 참조자 이다.
Widget& operator=(const Widget& rhs) {
...
return *this; // 좌변 객체(의 참조자)를 반환한다.
}
...
};
‘좌변 객체의 참조자를 반환하게 만들자’ 라는 규약은 위의 단순 대입형 연산자 말고도 모든 형태의 대입 연산자에서 지켜져야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Widget {
public;
...
// +=, -+, *= 등에도 동일한 규약이 적용된다.
Widget& operator+=(const Widget& rhs) {
...
return *this;
}
// 대입 연산자의 매개변수 타이이 일반적이지 않을 때도 동일한 규약을 적용한다.
Widget& operator=(int rhs) {
...
return *this;
}
...
};
이와 같은 관례를 따르지 않아도 컴파일이 안된다거나 에러를 발생하지는 않는다. 하지만 이 관례는 모든 기본제공 타입들이 따르고 있을 뿐만 아니라 표준 라이브러리에 속한 모든 타입에서도 따르고 있다는 점은 무시할 수 없을 것이다.
요점
대입 연산자는 *this의 참조자를 반환하도록 만들자!
참고. Effective C++ 3/E - Scott Meyers