Data+

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(voidconst {
    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(voidconst {
    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(voidconst {
    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

활동하기