[ 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의 참조자를 반환하도록 만들자.
'컴퓨터공학 > Effective C++' 카테고리의 다른 글
11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자 (0) | 2025.02.13 |
---|---|
9. 객체 생성 및 소멸 과정 중에는 절대 가상 함수를 호출하지 말자 (0) | 2025.02.03 |
8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 (0) | 2025.02.02 |
6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 (0) | 2025.01.31 |
5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2025.01.31 |