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 클래스는 + 연산에 대해서 연산자 오버로딩이 되어 있구나!”