컴파일러는 이항 연산자를 다음과 같은 두 개의 방식중 가장 효율적이라고 판단되는 것을 택해서 처리한다.([], →, =, ()등 일부 연산자 제외)

<aside> 💡 *a.operator@(b); *operator@(a, b);

</aside>

컴파일러는 정확히 일치 하는 오버로딩 메서드가 없는 경우, 가장 가까운 '가능한' 메서드를 찾게 되는데 이를 이용하기 위해 아래와 같은 함수를 만들면 지난번 예시에서 불가능했던 교환법칙을 성립시킬 수 있다.

Complex operator+(const Complex& a, const Complex& b) {
	Complex temp(a);
	return temp.operator+(b);
}

위 예제에서 temp라는 임시 객체를 정의하는게 싫기 때문에 이런저런 시도를 해보면 다음과 같다.

<aside> 💡 Complex operator+(const Complex& a, const Complex& b) { return a + b; }

warning C4717: 'operator+' : recursive on all control paths, → function will cause runtime stack overflow

</aside>

위 코드에서는 a+b에서 a.operator+(b)가 실행되는 것이 아닌, operator+(a,b)가 호출되어 재귀적으로 무한히 많은 함수가 호출되게 된다.

<aside> 💡 Complex operator+(const Complex& a, const Complex& b) { return a.operator+(b); }

error C2662: 'Complex::operator +' : cannot convert 'this' pointer → from 'const Complex' to 'Complex &'

</aside>

리턴값에 a.operator+(b) 를 사용하게 된다면 const함수에서 const가 아닌 멤버 함수를 호출하지 못하여 에러가 발생하게 된다.

friend

특정 클래스에서 friend로 선언된 함수는 해당 크래스의 모든 정보에 접근할 수 있도록 허가한다.