2. 연산자 오버로딩(Overloading)
by Qerogram* 연산자는 함수이다. RET을 가진다는 의미이기도 하고, Overloading이 가능하다는 의미다.
* const를 함수 정의시 맨 뒤에 붙이면(1번 코드 참조) - 멤버 변수의 값을 수정하지 않겠다는 의미.
-> 사용 의미는 const형 Obj에서 저러한 Method들을 부를 수 있다.
* opetator+ 연산자 오버로딩의 경우, const를 맨 앞에 자료형 대신 붙인것을 볼 수 있는데, 이렇게 하면 const를 붙인 Member들을 부를 수 있다는 의미. => PrintIntNum() 호출 가능.
- void print() { } 가 있다면, const Obj에선 호출이 불가능함을 의미한다.(실제로 에러가 발생)
1. Method로 Overloading 구현.
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 | #include <iostream> using namespace std; class CData { private : int IntNum; public : CData(void) {} CData(int iNum) : IntNum(iNum) {} const CData operator+(const CData &rdata) const { CData Temp; Temp.IntNum = IntNum + rdata.IntNum; return Temp; } void PrintIntNum(void) const { cout << "IntNum is " << IntNum << endl; } }; int main(int argc, char* argv[]) { CData D(5), D2(20); D.PrintIntNum(); D2.PrintIntNum(); CData D3 = D+D2; D3.PrintIntNum(); return 0; } | cs |
* 결과
IntNum is 5
IntNum is 25
2. 외부함수로 Overloading
- 주의 friend Keyword로 private인 IntNum을 사용가능하게끔 만들어 주어야 한다.
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 | #include <iostream> using namespace std; class CData { friend const CData operator+(const CData &rdata, const CData &rdata2); private : int IntNum; public : CData(void) {} CData(int iNum) : IntNum(iNum) {} void PrintIntNum(void) const { cout << "IntNum is " << IntNum << endl; } }; const CData operator+(const CData &rdata, const CData &rdata2) { return CData(rdata.IntNum+rdata2.IntNum); } int main(int argc, char* argv[]) { CData D(5), D2(20); D.PrintIntNum(); D2.PrintIntNum(); CData D3 = D+D2; D3.PrintIntNum(); return 0; } | cs |
* 결과
IntNum is 5
IntNum is 20
IntNum is 25
3. 이름없는 임시객체
int IntNum = 1 + 2 + 3;을 한다면, 이름없는 임시 객체라는 것이 발생됨.
연산자 오버로딩 없이하는 연산에서는, 이름없는 임시객체를 추적할 수 없다.
(1+2)+3의 형태로 가기때문에 1+2를 임시 반환값으로 EAX 레지스터에 넣듯, EAX와 어느 메모리 주소를 더하는 행위를 생각하면 되겠다. 그 경우를 이름없는 객체라 한다.
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 31 32 33 34 | #include <iostream> using namespace std; class CData { friend const CData operator+(const CData &&rrdata, const CData &rdata2); friend const CData operator+(const CData &rdata, const CData &rdata2); private : int IntNum; public : CData(void) {} CData(int iNum) : IntNum(iNum) {} void PrintIntNum(void) const { cout << "IntNum is " << IntNum << endl; } }; const CData operator+(const CData &rdata, const CData &rdata2) { printf("일반 연산!\n"); return CData(rdata.IntNum+rdata2.IntNum); } const CData operator+(const CData &&rrdata, const CData &rdata2) { printf("이동 연산자(이름없는 임시 객체!)\n"); return CData(rrdata.IntNum+rdata2.IntNum); } int main(int argc, char* argv[]) { CData D(5), D2(20), D3(5); CData D4 = D+D2+D3; D4.PrintIntNum(); return 0; } | cs |
* 결과.
일반 연산!
이동 연산자(이름없는 임시 객체!)
IntNum is 30
- 참고 : http://ruvendix.blog.me/220949580504
'코딩 > C&C++' 카테고리의 다른 글
6. Quick Sort (0) | 2017.04.10 |
---|---|
5. void PTR (0) | 2017.04.09 |
4. 다형성 (0) | 2017.04.09 |
3. 복사생성자를 통한 깊은 복사. (0) | 2017.04.08 |
1. Template (0) | 2017.04.07 |
블로그의 정보
Data+
Qerogram