티스토리 뷰
대입 연산자는 *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
- 블루버블다이빙팀
- C#
- 현포다이브
- 울릉도
- 다이빙
- OpenSource
- 블루버블다이브팀
- Linux
- C++
- 성산블루버블
- 블루버블
- PowerShell
- Build
- 스쿠버다이빙
- ReFS
- C
- 양파다이브
- 패턴
- ip
- 서귀포
- 암호화
- DLL
- 제주도
- Windows
- 리눅스
- 윈도우
- Thread
- 서귀포블루버블
- 디자인패턴
- RSA
| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
