LANGUAGE STUDY/C C++
[Modern C++] Operator Overloading(연산자 오버로딩)
KUNDUZ
2023. 1. 17. 08:33
반응형
Operator Overloading(연산자 오버로딩)
- primitive type은 연산자를 default로 사용 가능하다.
- int a=3, b=4;
- a == b : true
- a + b : 7
- a > b : false
- custom data type은??
- struct Data {int x,y;};
- Data a, b;
- a == b ?
- a + b ?
- a > b?
특정한 기준이 없으므로 연산자를 사용할 수 없다.
이를 정의해주는게 operator overloading(연산자 오버로딩)
Member function Overloading (global function overloading은 생략)
struct Data {
int x, y;
bool operator==(Data r) {
return x == r.x && y == r.y;
}
bool operator<(Data r) {
if (x != r.x) return x < r.x;
return y < r.y;
}
void operator()() {
cout << x << ' ' << y;
}
void operator()(Data r) {
x += r.x;
y += r.y;
}
};
Data a, b;
a == b : a.operator==(b)
a < b : a.operator<(b)
a() : a.operator()()
a(b) : a.operator()(b)
operator() : function call operator
함수를 인자로
STL container에서 기준 설정할 때 활용(다른 방법도 있지만 우리에게는 이거 밖에 없다고 가정)
- set<T, Compare>
- unordered_set<T, Hash, KeyEqual>
Compare, Hash, KeyEqual : function object
Function object (functor)
- function call operator()를 정의하여 함수처럼 사용가능한 객체
- 인라인 치환
- 상태를 가질 수 있다
- 다른 함수의 인자로 전달될 수 있다.
struct Sum_n {
int operator()(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) sum += i;
return sum;
}
}sum_n;
cout << sum_n(10); // 55
cout << Sum_n{}(10); // 55
cout << Sum_n()(10); // 55
반응형