C++의 대입 연산즌 여러 개가 사슬처럼 엮일 수 있는 성질을 갖고 있다.
int x, y, z;
x = y = z = 15;
또한 우측 연관 연산이다. 위의 대입 연산 사슬을 아래와 같이 표현할 수 있다.
x = (y = (z = 15));
15가 z에 대입되고, 그 대입 연산 결과 갱신된 z가 y에 대입된 후, 갱신된 y가 x에 대입되는 것이다.
이렇게 대입 연산이 사슬처럼 엮이려면 대입 연산자의 좌변 인자에 대한 참조자를 반환하도록 구현되어 있어야 한다.
이런 구현은 일종의 관례(convention)인데, 나도 이 관례를 지키는게 좋다.
class Widget
{
public:
Widget& operator=(const Widget& rhs)
{
return (*this); //좌변 객체의 참조자를 반환
}
};
좌변 객체의 참조자를 반환하게 만들자라는 관례는 단순 대입 연산자말고도 모든 형태의 대입 연산자에서 지켜져야 한다.
class Widget
{
public:
Widget& operator=(const Widget& rhs)
{
return (*this); //좌변 객체의 참조자를 반환
}
Widget& operator*=(const Widget& rhs)
{
return (*this); //좌변 객체의 참조자를 반환
}
Widget& operator+=(const Widget& rhs)
{
return (*this); //좌변 객체의 참조자를 반환
}
Widget& operator=(size_t rhs) //매개 변수 타입이 일반적이지 않을 경우에도 동일
{
return (*this); //좌변 객체의 참조자를 반환
}
};
이것만은 잊지말자
대입 연산자는 *this의 참조자를 반환하도록 만들자
728x90
'서적 정리 > Effective C++' 카테고리의 다른 글
14.자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 (0) | 2021.12.11 |
---|---|
13.자원 관리에는 객체가 그만! (0) | 2021.12.10 |
12.객체의 모든 부분을 빠짐없이 복사하자 (0) | 2021.12.10 |
11.operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자 (0) | 2021.12.10 |
9.객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 (0) | 2021.12.10 |
8.예외가 소멸자를 떠나지 못하도록 붙들어 놓자 (0) | 2021.12.10 |
7.다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 (0) | 2021.12.10 |
6.컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 (0) | 2021.12.10 |
댓글