본문 바로가기
언어/C++

(C++)연산자 오버로딩의 활용

by 흥부와놀자 2020. 6. 29.
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+(Point arg) const
	{
		Point pt;
		pt.x = this->x + arg.x;
		pt.y = this->y + arg.y;
		cout << "operator 호출" << endl;
		return pt;
	}
};
int main()
{
	Point p1(1, 1);
    Point p2(2,2);
	Point p3 = p1+p2;
    p3.print();


}

c++은 객체끼리의 연산자를 지정해 정의하게 해주는 연산자 오버로딩을 지원한다. 

아주 다양한 연산자를 오버로딩 할수 있는데 위의 코드의 +같은 사칙연산 외에도 ++,--,==,!= 등 거의 모든 연산자에 대해 정의할수 있다. 

operator()를 이용하면 함수호출 처럼 만들어 낼수 있고  operator[](int index)를 이용해 객체를 배열처럼 표현하여 쓸수 있다. 

 

또한 operator Type()을 이용하여 해당 객체의 타입변환을 정의할 수 있다.

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; }
	operator int()
	{
		return this->x;
	}

};
int main()
{
	Point p1(1, 1);
	int X = p1;
	printf("%d", X);


}

위의 코드는 Point 객체의 int타입으로의 변환을 정의해 준것이다.

 

연산자 오버로딩의 작동원리는 컴파일러가 위의 p1 + p2를 보고 p1.operator+(p2)로 바꾸어 준다.(첫번째 +연산자 코드 참조) 

 

이러한 연산자 오버로딩은 객체끼리의 관계를 명확하게 표현하여 객체지향 설계에 더욱 다가가게 만들어 주는 좋은 도구인것 같다.