연산자 오버로딩에는 2가지 종류가 있다.
첫째, 멤버 함수를 이용한 연산자 오버로딩
둘째, 전역 함수를 이용한 연산자 오버로딩
전역 함수를 이용한 연산자 오버로딩의 샘플 코드를 먼저 보겠다.
#include <iostream>
using namespace std;
class Point
{
int x;
int y;
public:
Point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
void Print()const { cout << x << ',' << y << endl; }
const Point operator+(const Point& arg) const
{
return Point(x - arg.x, y - arg.y);
}
const Point& operator++()
{
++x;
++y;
return *this;
}
const Point& operator++(int pDummy)
{
Point pt(x, y);
++x;
++y;
return pt;
}
const bool operator==(const Point& arg) const
{
return x == arg.x && y == arg.y ? true : false;
}
const bool operator!=(const Point& arg) const
{
return !(*this==arg);
}
friend const Point operator-(const Point& argL, const Point& argR);
int GetX()const { return x; };
int GetY()const { return y; };
};
const Point operator-(const Point& argL, const Point& argR)
{
return Point(argL.x - argR.x, argL.y - argR.y);
}
int main()
{
Point p1(2, 3), p2(5,5);
int k = 10;
Point p3 = k - p1;
//Point p4 = k + p1;
p3.Print();
return 0;
}
일단 operator- 함수가 Point 멤버를 벗어나 전역으로 선언 되었다.
멤버 함수로 동작할때는 Point p3 = k - p1; 같은 연산을 할 수 없다. k.operator-(p1) 실제로 이렇게 동작하는데 k는 Point 클래스가 아니기 때문이다. 하지만 전역 변수로 k, p1 둘다 arg로 받는 형태가 되면 Point p3 = k - p1; 연산이 가능해진다. 실제로 위 코드를 실행하면 8, -3이 출력된다. k - p1.x, 0 - p1.y 이렇게 연산이 된 것이다.
추가로 friend를 선언하면 전역 함수에서도 Get,Set 함수를 쓰지 않고 Private 변수를 사용할 수 있다.