대입 연산은 여러 개가 사슬처럼 엮일 수 있고 우측 연관 연산이라는 특징이 있다.
1
2
3
4
5 |
int x,y,z;
x = y = z = 15; //아래 코드와 같은 의미
x = (y = (z = 15)); //위의 코드와 같은 의미 |
cs |
이렇게 대입 연산이 사슬처럼 엮이려면 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어 있을 것 이다.
이런 구현은 일종의 관례인데, 사용자가 직접 구현하는 클래스에 대입 연산자가 들어간다면 이 관례를 지키는 것이 좋다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
class Widget
{
public:
...
Widget& operator=(const Widget& rhs) //반환 타입은 현재 클래스에 대한 참조자.
{
...
return *this; //좌변 객체의 참조자를 반환.
}
Widget& operator+=(const Widget& rhs) //+=, -=, *= 등에도 동일한 규약이 적용.
{
...
return *this; //좌변 객체의 참조자를 반환.
}
Widget& operator=(int rhs) //대입 연산자의 매개변수 타입이 일반적이 않은 경우에도
{ //동일한 규약을 적용.
...
return *this;
}
}; |
cs |
"좌변 객체의 참조자를 반환하게 만들자"라는 규약은 모든 형태의 대입 연산자에서 지켜져야 한다.
이 관례는 모든 기본 제공 타입들이 따르고 있고 표준 라이브러리에 속한 모든 타입들에서도 따르고 있다.
따르지 않더라도 컴파일이 안되거나 그런건 아니지만 관례는 그냥 따르는게 좋다.
* 주의 사항
1
2
3
4
5
6
7
8
9
10
11 |
Widget& operator=(const Widget& rhs) //반환 타입은 현재 클래스에 대한 참조자.
{
...
return *this; //좌변 객체의 참조자를 반환.
}
Widget* operator=(const Widget* const rhs) //반환 타입은 현재 클래스에 대한 주소값.
{
...
return this; //좌변 객체의 주소값을 반환.
} |
cs |
참조 타입은 반환시 일반 객체에 대입이 가능하고 (객체 자체를 반환)
포인터 타입은 반환시 포인터 객체에 대입이 가능하다. (객체의 주소값을 반환)
헷갈리지 말 것!!
1줄 요약
- 대입 연산자는 *this의 참조자를 반환하도록 만들자.
'Program Language > C++' 카테고리의 다른 글
항목12. 객체의 모든 부분을 빠짐없이 복사하자. (0) | 2017.07.27 |
---|---|
항목11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자. (0) | 2017.07.26 |
항목9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자. (0) | 2017.07.25 |
항목8. 예외가 소멸자를 떠나지 못하도록 붙을어 놓자. (0) | 2017.07.24 |
항목7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. (0) | 2017.07.21 |