C++에서는 대부분의 연산자를 오버로딩 할 수 있지만 일부 연산자는 특정 목적으로만 사용되어야 한다. 예를 들면 주소 연산자 &
를 오버로딩하려면 마땅한 이유가 필요하다.
연산자 오버로딩이 표준 타입의 행동에 가까울수록 다른 사람들이 더 신뢰할 수 있다.
예를 들어, =
, +
, +=
을 사용자 정의한 경우 a=a+b
와 a+=b
는 같은 효과를 가져야 한다.
항의 개수도 가변적인 항을 취하기도 하지만, 일반적으로 가변적인 항을 허용하는 유일한 연산자는 응용 연산자인 operator()
이다.
예를 들어 행렬 A
, B
에 대해 아래처럼 연산자를 정의했다고 하자
A = B^2;
직관적으로 A
는 B
의 제곱이며, ^
연산자는 비트 연산자이지만 행렬에 대해서는 비트 연산이 필요없으므로 괜찮아 보인다. 하지만 아래의 경우를 생각해보자
A = B^2 + C;
여기서 C++의 연산자 우선순위는 +
가 ^
보다 높기 때문에 컴파일러는 아래처럼 이해한다.
A = B^(2+C);
따라서 연산자의 의미 및 의도한 우선순위가 C++ 연산자의 우선 순위와 일치해야 한다.
이진 연산자 오버로딩 함수를 class의 멤버로 선언할지, 자유 함수(inline function)으로 선언할지는 암시적 변환을 구현해 자유 함수로 선언해야 한다.