Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

연산자 오버로딩(Operator Overloading) 본문

C & C++/C++ Basic

연산자 오버로딩(Operator Overloading)

snd-snd 2019. 9. 22. 23:44

연산자 오버로딩

 

기본적으로 제공하고있는 연산자들[산술, 논리, 관계 등]을 재정의해 함수로서 호출하는 것.

원형은 함수지만 연산자를 이용하듯 호출할 수 있다. (함수 호출방식으로도 사용가능)

원형이 함수이기 떄문에 다중 정의(오버로딩)가 가능하다.

 

1. 기존에 존재하지 않는 연산자를 사용해 정의하는 것을 불가능하다. (예: **, ?!, # 등)

2. 정적 함수로 만들 경우 다중 정의가 불가능하다.

 

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "stdafx.h"
#include <iostream>
using namespace std;
class CMyData
{
public:
CMyData(int nParam) : nData(nParam) //
{
cout << "CmyData(int)" << endl;
}
CMyData(const CMyData &&rhs) : nData(rhs.nData) //
{
cout << "CmyData(const CmyData&&)" << endl;
}
operator int(void) //
{
return nData;
}
CMyData operator+(const CMyData &rhs) //
{
cout << "operator+" << endl;
CMyData tmp(0);
tmp.nData = this->nData + rhs.nData;
return tmp;
}
CMyData& operator=(const CMyData &rhs) //
{
cout << "operator=" << endl;
this->nData = rhs.nData;
return *this;
}
bool operator==(const CMyData &rhs) //
{
if (nData == rhs.nData) return true;
return false;
}
int operator[](int nIndex) //
{
return arrData[nIndex];
}
int operator++() // ()
{
return ++nData;
}
int operator++(int) // ()
{
int nData = nData++;
return nData;
}
private:
int nData = 10;
int* arrData = nullptr;
};
int main()
{
CMyData a(1), b(2), c(3);
a = b + c; //
cout << a << endl; // int
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

위 23, 31행 처럼 'operator'라는 키워드를 이용해 연산자 함수를 정의할 수 있다.

또한 사용자 코드에서는 68번 행처럼 연산자를 이용하듯 사용할 수 있다.

 

68번행의 a = b + c를 풀어서 작성하면 a.operator=( b.operator(c) )가 된다.

 

 

※ 주의점

 

연산자 함수를 사용함에 있어 주의할 점은 이전에 설명한 생성자들과 임시 객체이다.

 

위 코드만 실행하더라도 68번행에서 b + c 함수 호출시 tmp 객체를 생성해 b + c의 값을

tmp 객체에 넣고 return 문을 통해 tmp객체를 반환할 때 이동 생성자를 호출해 객체를 생성한다.

tmp 객체의 값은 이동 생성자를 통해 생성된 객체에 저장되고, 이후 tmp 객체는 사라진다.

그 다음에 a = 함수를 호출하면서 함수의 인자값으로 이동 생성자 객체를 담게 된다.

이동 생성자 객체는 a 에 본인이 가지고있는 값을 대입한뒤 스코프가 끝나면 소멸하게 된다.

 

결과적으로 위 코드는 사용자 코드에서 CMyData는 a, b, c 세 개만 선언됬지만,

연산자 함수를 통해 연산을하게 되면서 tmp 객체와 이동 생성자 객체를 생성해 연산을 하게된다.

눈에 보이는 CMyData 객체는 3개지만 실제로는 5개의 CMyData 객체가 사용된다.

'C & C++ > C++ Basic' 카테고리의 다른 글

이동 생성자(Move Constructor)  (0) 2019.09.22
변환 생성자(Conversion Constructor)  (0) 2019.09.22
복사 생성자(Copy Constructor)  (0) 2019.09.22
클래스(Class)  (0) 2019.09.21
네임 스페이스(Namespace)  (0) 2019.09.21
Comments