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를 멤버로 만들려 한다. |