연산자 오버로딩은 기존 기호에 사용자 타입의 의미를 붙인다. 새 기호를 발명할 수는 없다. 우선순위도 바꿀 수 없다.

C++ 15. 연산자 오버로딩의 핵심 흐름도
그림. 오버로드는 기존 연산자의 직관을 깨지 않아야 한다.

대칭과 대입

struct Pos {
    int file;
    int rank;
    bool operator==(const Pos& o) const {
        return file == o.file && rank == o.rank;
    }
};

C++20부터는 `operator==` 하나만 정의해도 `!=`가 만들어지는 경우가 있다. 대입 `operator=`와 복합 대입 `operator+=`는 왼쪽 객체를 바꾸므로 멤버로 둔다. 양쪽이 대칭인 `+`는 멤버가 아닌 함수로 두면 왼쪽 변환도 가능하다.

오버로드하지 않을 연산자

`&&`, `||`, 쉼표 연산자는 오버로드하면 평가 순서가 기본 의미와 달라진다. 멤버 접근 `.`와 영역 `::`는 오버로드할 수 없다. 변환 연산자는 암시적 변환을 늘려 오버로드 해석을 흐리므로 `explicit operator`로 제한한다.

증가 연산자를 만들 때는 전위와 후위를 구분한다. 후위는 더미 `int` 매개변수를 받는 관례가 있다. 정수에서처럼 전위가 더 단순하다.