operator+ 라는 이름의 함수

public:
	Point operator+(const Point &ref)
	{
		Point pos(xpos+ref.xpos, ypos+ref.ypos);
		return (pos);
	}
	...
	
int main(void)
{
	Point pos3=pos1.operator+(pos2); // 이와 같이 operator+라는 이름의 함수로 사용된다.
	Point pos4=pos1+pos2; // 위에 수식과 같다. 약속된 변환 규칙에 의해 위에 함수를 부른다.
}

위와 같이 operator 키워드와 연산자 를 묶어서 함수를 정의하면, 함수의 이름을 이용한 함수의 호출뿐만아니라, 연산자를 이용한 함수의 호출도 허용해준다.

pos1+pos2; //왼쪽에 pos1개체를 대상으로 operator+ 함수를 불러 pos2 피연산자를 매개변수로 전달한다

pos1+pos2; //는
pos1.operator+(pos); //와 100% 동일한 문장이다.

연산자를 오버로딩 한 함수도 함수이기 때문에 const 로 선언이 가능하다. 덧셈연산이라는 것이 원래 연산의 대상이 되는 피연산자의 값을 변경하는게 아니고, 새로운 연산의 결과를 만들어내는 것이기 떄문이다.

연산자를 오버로딩 하는 두 가지 방법

post.operator+(pos2); //맴버함수 오버로딩
operator+(pos1, pos2); //전역함수 오버로딩

오버로딩을 동시에 진행했을 경우 멤버함수로 오버로딩된 함수가 먼저 불린다.

public:
	friend Point operator+(const Poing &pos1, const Point &pos2);
	...

“아! operator+ 함수 내에서는 Point 클래스의 private 영역에 접근이 가능하겠구나!”

&&

“아! Point 클래스는 + 연산에 대해서 연산자 오버로딩이 되어 있구나!”

오버로딩이 불가능한 연산자의 종류