티스토리 뷰

728x90

대입 연산자는 *this의 참조자를 반환하게 하자

대입 연산은 우측연관(Right Associative) 연산이다.

1
2
3
4
5
6
void main()
{
    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
23
24
25
26
27
28
29
class Widget
{
private :
    int m_nData;
 
public :
        void Set(const int _nValue) 
        {
            m_nData = _nValue;
        }
        int  Get() const 
        {
            return m_nData;
        }
        Widget& operator=(const Widget&rhs)
        {
            m_nData = rhs.m_nData;
            return *this;
        }
 
};
 
void main()
{
 
       Widget a, b, c;
       c.Set(15);
       a = b = c;
}
cs

위의 코드는 객체의 대입연산이다. 

기존 변수와의 대입은 우측부터 좌측으로 대입연산이 가능하였으나 
C++의 경우 클래스와 클래스의 경우 변수가 아닌 객체끼리의 대입이기에 아무런 재정의가 없다면 디폴트 연산자가 실행된다.

하지만 얇은 복사로 되다 보니 함수로 받아온 객체를 대입했을 경우 주소만 복사되어 답을 받을 수 없을 것이다. 
그리하여 Operator라는 연산자 오버로딩이 있는 것이고 연산자 오버로딩의 경우 연산자의 재정의가 가능하다.

main()을 먼저 보자 main()을 보게되면 Widget타입으로 a,b,c라는 객체를 생성하고 
private 영역에 m_nData가 있기에 Set메서드를 이용하여 c의 객체의 m_nData라는 변수에 15라는 값을 대입을 시켰다.

그리고 a=b=c라는 대입 연산을 하였다. 

위에서 애기한 것과 같이 대입연산은 우측부터 사슬처럼이어진다.
그러기에 최초 b=c가 실행이 될것이다. 
실행이 되었다면 operator부분이 실행 될 것이다. 

Widget& operator=(const widget &rhs) 부분을 Widget& b=const Widget& rhs 이렇게 해석할 수 있다. 

이부분에서 &를 붙임으로써 레퍼런스로 한 것을 알수 있다. 

이는 원본의 값을 바꾸겠다는 뜻이 되는데 오른쪽 rhs는 const를 붙임으로써 상수화 시켰다는 것을 알 수 있다.
그리고 연산자 오버로딩으로 들어와 private 영역의 a에 rhs의 객체의 a라는 변수를 대입을 시켰고
return *this 를 하였는데 이것은 좌변객체를 보면 Widget&로 하였다. 이것은 위에서 말한것과 같이 
레퍼런스다 보니 this가 아닌 *this가 된것이다.
 

결론

 대입 연산자는 *this의 참조자를 반환하도록 하자!

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함
250x250