[C++STL] 연산자 오버로딩 - 전역 함수 이용

박남호·2022년 11월 23일
0

연산자 오버로딩에는 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 변수를 사용할 수 있다.

profile
NamoPark

0개의 댓글