대입 연산은 여러 개가 사슬처럼 엮일 수 있고 우측 연관 연산이라는 특징이 있다.

 

1
2
3
4
5
int x,y,z;
 
= y = z = 15;     //아래 코드와 같은 의미
 
= (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의 참조자를 반환하도록 만들자.

+ Recent posts