-
연산자 오버로딩이란 연산자를 사용자가 필요에 의해 재정의하는 것이다.
123456789class Test{public:int value;Test(int _value) : value(_value){}}Test test1(1), test2(2);test1 + test2 //compile 에러cs Test 클래스끼리 더한 값을 알고 싶을 때, + 연산자를 사용하면 컴파일 에러가 발생한다.
이유는 Test 클래스에서 + 에 대한 연산자가 무슨 역할을 하는지 지정하지 않았기 때문이다.
12345678910111213141516171819202122232425262728#include <iostream>using namespace std;class Test{public:int value;Test(int _value) : value(_value){}Test operator+ (const Test &rhs){return Test(value + rhs.value);}int operator+ (const int &rhs){return value + rhs;}};int main(){Test test1(10), test2(20);//아래 두 문장은 같은 함수이다.Test t1 = test1.operator+(test2);Test t2 = test1 + test2;int sum = test1 + 20;cout << t1.value << " " << t2.value << endl;cout << sum;}cs 9번째 줄과 13번째줄에서 + 연산자에 대해 정의를 했다.
함수 정의를 보면 일반적인 함수와 비슷하다.
이름만 자기가 오버로딩하고 싶은 연산자로 지정을 하고, 리턴타입과 인자을 정의하고 안에 함수 내용을 채운다.
위 코드의 실행결과는
30 30
30
이다.
문제풀이에서는 주로 < 연산자에 대해 오버로딩을 하는데, 이유는 정렬이나 우선순위큐에서 '<' 연산자를 사용해 정렬을 하기 때문이다.
예를 들어 두 수로 이뤄진 객체가 있고 이러한 객체들이 여러개 있다고 가정한다, 그리고 객체의 두 수의 차이의 절대값이 작은 순으로 출력하라. 라는 문제가 있다고 가정하자.
정렬을 할 때, 두 수의 절대값을 비교해서 작은 순으로 정렬하면 되는 문제이다.
정렬함수인 sort는 내부에서 '<' 연산자를 이용해서 비교한다.
그래서 연산자 오버로딩을 통해 우리가 원하는 작업을 추가하면 된다.
아래 11번째 줄에 '<' 연산자를 오버로딩함으로써 두 객체의 절대값을 비교한다.
1234567891011121314151617181920212223242526272829303132333435363738#include <iostream>#include <algorithm>#include <vector>using namespace std;int abs(int x){return x < 0 ? -x : x;}struct info {int x, y;info(int _x, int _y) : x(_x), y(_y) {}bool operator< (const info& rhs){// 두 값의 차이의 절대값 = abs(x-y)// 두 개를 비교하여 작으면 참을 리턴한다// 만약 아래 부등호를 > 으로 바꾸면 오름차순으로 정렬된다.return abs(x-y) < abs(rhs.x - rhs.y);// 아래 코드는 위와 동일한 문장이다// if(abs(x-y) < abs(rhs.x - rhs.y)) return true;// else return false;}};int main(){vector<info> v;v.push_back(info(1, 2));v.push_back(info(3, 5));v.push_back(info(1, 5));v.push_back(info(100, 2));v.push_back(info(10, 2));v.push_back(info(30, 2));sort(v.begin(), v.end());for(info i : v){cout << i.x << " " << i.y << " diff : " << abs(i.x - i.y) << endl;}}cs ㅇ
결과는 아래와 같다
ㅇㅇㅇㅁㄴㅇㅁㄴㅁㅁ댓글