2017-05-15 7 views
0

더하기 기호의 연산자 오버로딩을 이해하려고합니다. 나는 2 개의 프로토 타입을 본다 :C++에서 더하기 연산자 오버로드 연산자

Box operator+(const Box& b) { ... } 
Box operator+(const Box& left, const Box& right) { ... } 

어느 것이 옳은가? 그 차이가 멤버 함수이고 두 번째 멤버가 아닌 멤버 인 경우 두 방법을 정의한 다음 어느 것이 호출 될까요? "오른쪽"또는 무엇

Box a, b; 
Box c = a + b; 
+0

사용해보기. (채우기, 채우기) –

+0

_ "두 가지 방법을 모두 정의 할 수 있습니다."_ 시도 할 때 어떤 일이 일어 났습니까? –

+0

@RustyX : 어떻게 보이지 않습니다. –

답변

1

는 "더 나은"응용 프로그램에 따라 다릅니다. 회원 버전은 Box의 모든 개인 속성 및 메소드에 대한 액세스 권한을 부여하지만 Boxfriend으로 선언되지 않는 한 비회원 버전은 허용되지 않습니다. 그러나 비회원은 템플릿 화되어 다양한 유형에 적용될 수 있습니다.

구성원은 일반적으로 비회원보다 컴파일러에서 선호하지 않으며 그 반대도 마찬가지입니다. 대신 C++ overload resolution rules은 둘 중 하나를 선택하는 데 적용됩니다. Box& 멤버 함수 (*this) 및 const Box& b 호출하기 위해 사용되는 오브젝트를 말한다 :

Box Box::operator+(const Box& b)

는 2 개 개의 인수를 취하는 것처럼 처리된다.

예에서 ab은 모두 const가 아닙니다.

Box Box::operator+(const Box& b)을 호출하려면 b을 const 참조로 변환해야합니다.

Box operator+(const Box& left, const Box& right)을 호출하려면 ab을 모두 const 참조로 변환해야합니다.

회원 운영자가 더 적합하므로 (전환이 적음) 회원 운영자가 선택되었습니다.

operator+const으로 선언 되었다면 호출이 모호 해져서 컴파일러 오류가 발생했을 것입니다.

+0

다른 중요한 차이점 중 하나는 멤버가 아닌 사람이 왼손 피연산자를 '상자'로 암시 적으로 변환 할 수있게합니다. 회원은 그렇지 않습니다. – aschepler