본문 바로가기
Language/C++

연산자 오버로딩과 주의할 점

by W00gie 2020. 12. 23.

연산자 오버로딩은 C++에서 제공하는 기본 타입이 아닌 클래스 타입에서 사용자가 정의한 타입에도 연산자를 사용할 수 있게 하는 문법이다. 예문은 다음과 같다.

#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)
	{
		Point pt;
		pt.x = this->x + arg.x;
		pt.y = this->y + arg.y;
		
		return pt;
	}
};

int main()
{
	Point p1(2, 3), p2(5, 5);
	Point p3;
	p1 + p2;
	p3 = p1 + p2;
	p3.Print();
	return 0;
}

 

Point의 멤버함수로써 선언한 operator+ 함수는 기본 연산자인 c++ 언어내의 + 연산자에 오버로딩 되어.

Point 타입의 변수를 + 연산할 때 해당 함수가 호출된다.

Main문의 p1 + p2 에서 this는 p1이, arg에 p2가 대입되어 선언된다.

 

+,-, =,!= 등의 이항연산자들을 오버로딩 할때에는 좌항이 오버로딩 객체가 아니면 위와 같은 멤버함수를 이용한 오버로딩이 불가능하다. 이럴때에는 '전역 변수'로 연산자를 오버로딩하여 사용 가능하다.

이향 연산의 왼쪽 객체의 타입을 기반으로 연산자 오버로딩 함수를 호출하기 때문이다.

 

전역변수 선언외에도 C++의 프렌드 기능을 이용해 접근할 수 있으나 프렌드 기능은 캡슐화를 저해하는 영향이 있어 사용을 자제하는 것이 좋다.