C++ 연산자 오버로딩

연산자 의미를 기존 언어 관습과 일치시키기

연산자 오버로딩은 짧은 문법을 얻는 기능이 아니라 타입이 자연스럽게 동작하도록 계약을 맞추는 기능이다. 피연산자 순서, 반환 타입, 값 범주, 예외 가능성을 함께 설계한다.

01

의미 검증

+는 덧셈, ==는 동등성처럼 호출자가 기대하는 의미와 맞는지 확인한다.

놀라움 최소화
02

멤버/비멤버 선택

좌항이 변환될 수 있어야 하는 대칭 연산은 비멤버가 유리하다.

lhs 변환
03

복합 대입

+=를 먼저 구현하고 +는 복사 후 +=를 호출하게 만들 수 있다.

중복 감소
04

비교 일관성

==, <, <=>의 관계가 컨테이너 정렬과 검색 전제에 맞는지 본다.

strict weak ordering
operator=
자기 대입과 자원 관리 복사 대입은 기존 자원 해제와 새 자원 확보 순서가 예외 안전해야 한다.
copy-and-swap
operator[]
접근 비용과 범위 검사 const/non-const 버전을 나누고 out-of-range 정책을 정한다.
at과 구분
operator<<
스트림 체이닝 ostream&를 반환해야 연속 출력이 가능하다.
비멤버 friend 후보
operator bool
조건식 변환 explicit로 의도치 않은 산술 변환 후보를 줄인다.
safe bool

수명 · 일관성 · 가독성 점검

수명 지역 객체 참조를 반환하거나 임시 수명을 넘겨 쓰지 않는지 확인한다.
일관성 a == b이면 hash와 ordering 계약도 맞는지 함께 본다.
가독성 도메인 의미가 약하면 이름 있는 함수가 연산자보다 낫다.