보통 데이터의 값을 더하거나 뺄 때 저희는 이런 식으로 작성할 겁니다.
int n1 = 10;
int n2 = 20;
int sum = n1 + n2;
하지만 객체의 덧샘을 하게된다면??
class A 가 있다고 가정해 본다면
A a1;
A a2;
A a3 = a1 + a2;
이런 식의 객채 연산은 상식적으로 불가능 하다고 보여집니다.
하지만 이를 가능하게 하는것이 바로 연산자 오버라이딩 입니다.
즉, '+'를 오버라이딩 하는 것입니다.
이때 사용하는 것이 operator라는 함수 키워드 입니다.
사용 방법을 보면 이렇습니다.
#include<iostream>
using namespace std;
class A {
public:
int n1;
A(int n1) {
this->n1 = n1;
}
};
A operator+(const A& a1, const A& a2) {
A a(a1.n1 + a2.n1);
return a;
}
int main(void) {
A a1(10);
A a2(20);
A a3 = a1 + a2;
cout << a3.n1 << endl;
return 0;
}
여기서 +만 무조건 되는건 아닙니다. operator-, operator*, operator/ 등.... 이 가능합니다.
아래는 operator로 오버라이딩이 가능한 키워드를 소개하겠습니다.
= (할당 연산자, assignment operator)
+ - * (이진 산술 연산자, binary arithmetic operators)
+= -= *= (복합 할당 연산자, compound assignment operators)
== != (비교 연산자, comparison operators)
위에 것들이 사용 가능한 키워드 이며 사용자가 오버라이딩을 통해 재 정의가 가능합니다.
아래는 오버라이딩이 불가능한 연산자를 소개하겠습니다.
. 맴버 접근 연산자
.* 맴버 포인터 연산자
:: 범위 지정 연산자
?: 조건 연산자(3항 연산자)
sizeof 바이트 단위 크기 계산
typeid RTTI 관련 연산자
static_cast 형변환 연산자
dynamic_cast 형변환 연산자
const_cast 형변환 연산자
reinterpret_cast 형변환 연산자
연산자 오버라이딩은 저희가 흔히 사용하는 ++ or --도 지원을 하고 있습니다.
#include<iostream>
using namespace std;
class A {
public:
int n1;
A(int n1) {
this->n1 = n1;
}
};
A& operator++(A& a1) { //전위증가
a1.n1++;
return a1;
}
A operator++(A& a1, int) { //후위증가
A temp(a1.n1);
a1.n1++;
return temp;
}
int main(void) {
A a(10);
++a;
cout << a.n1 << endl;
A p = a++;
cout << p.n1 << endl;
cout << a.n1 << endl;
return 0;
}
위 예제에서 보이듯 전위증가와 후위증가가 잘 된걸 볼 수 있습니다.
전위 증가의 선언 방법은
operator++() 이고
후위증가 선언 방법은
operator++(int) 입니다.
즉, 매개변수에 int의 여부에 따라 전위인지 후위인지 결정되는 것입니다.
그렇다면..... 교환법칙 문제의 해결은 어떻게 하면 좋을까요??
즉, 3 + a1 요녀석을 어떻게 해야하는지는 아래의 예시를 통해 설명하겠습니다.
#include<iostream>
using namespace std;
class A {
public:
int n1;
A(int n1) {
this->n1 = n1;
}
};
A operator+(const int num, const A& a) {
A temp(num + a.n1);
return temp;
}
A operator+(const A& a, const int num) {
return num + a;
}
int main(void) {
A a(10);
int num = 20;
A p1 = num + a;
A p2 = p1 + num;
cout << p1.n1 << endl;
cout << p2.n1 << endl;
return 0;
}
이런식으로 operator를 정의하면 되겠습니다.!!
'프로그래밍 > C++' 카테고리의 다른 글
C++ 템플릿, 템플릿 함수, 함수 템플릿의 특수화.... (0) | 2019.05.17 |
---|---|
cout, cin, endl의 연산자 오버라이딩. (0) | 2019.05.17 |
C++, const란?, 사용법! (0) | 2019.03.12 |
C++, friend 사용법. (0) | 2019.03.11 |
C++ virtual 함수란? (0) | 2019.03.11 |
댓글