티스토리 뷰
대입 연산자는 *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
- Effective c++
- Windows
- OpenSource
- 패턴
- 스쿠버다이빙
- 서귀포
- script
- Linux
- 성산블루버블
- PowerShell
- 현포다이브
- CMake
- 네트워크 정보
- C
- effective
- C# 고급 기술
- 블루버블다이브팀
- C++
- Build
- 제주도
- 울릉도
- 스쿠버 다이빙
- C#
- DLL
- 블루버블다이빙팀
- 블루버블
- 서귀포블루버블
- 암호화
- 외돌개
- C#.NET
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |