operator overloading

연산자 오버로딩은 기호에 타입의 의미를 붙이는 일이다

Point + Point가 무엇을 뜻하는지 컴파일러는 모른다. operator+를 정의하면 표현식, 피연산자, 반환값의 계약이 한 자리에 묶인다.
대상 사용자 정의 타입의 객체다.
형식 멤버 함수 또는 비멤버 함수로 정의한다.
의미 기존 기호의 직관을 벗어나면 읽기 어려워진다.
left Point p1 왼쪽 피연산자이며 멤버 함수라면 this가 된다.
+
right Point p2 오른쪽 피연산자이며 보통 const Point&로 받는다.
result Point(x + other.x, y + other.y) 두 좌표를 더한 새 객체를 반환한다.
정의 전 p1 + p2는 컴파일 오류 컴파일러가 Point끼리 더하는 규칙을 알지 못한다.

멤버 함수로 정의했을 때

Point Point::operator+(const Point& other) const p1.operator+(p2) return Point(x + other.x, y + other.y)
표현식은 짧아지지만 실제로는 함수 호출이다. 그래서 반환 타입, const, 인자 전달 방식이 모두 의미의 일부가 된다.

연산자를 추가하기 전에 네 가지를 먼저 고른다

질문 확인할 것 좋은 신호 나쁜 신호
기호가 자연스러운가 +, ==, <<의 일반 의미 도메인에서 바로 읽힌다. 기호 의미를 뒤집어야 이해된다.
원본을 바꾸는가 새 값을 반환할지 자기 자신을 바꿀지 +는 새 값, +=는 변경 비슷한 연산자가 서로 다르게 동작한다.
함수 위치는 맞는가 왼쪽 피연산자를 누가 소유하는지 좌측이 클래스 객체면 멤버 함수가 가능하다. std::cout << obj를 멤버로 만들려 한다.