10

this 스레드에 대한 응답에 따르면 비 구성원 함수로 operator=을 오버로드 할 수 없습니다. 왜이과부하 연산자 = 비회원으로

class MyClass 
{ 
    // ... 
}; 

MyClass& operator=(MyClass& Left, MyClass& Right) 
{ 
    // ... 
} 

입니다 : 그래서, 예를 들어, 다음은 매우 화가 컴파일러 무엇입니까? getter와 setter가있는 컨테이너 클래스가 있으므로 멤버 함수가 필요 없으며 캡슐화가 중단됩니다. 앞서 언급 한 스레드에 대한 답변 중 하나는 "L 값이 첫 번째 피연산자로 수신되었음을 확인하는 것"이라고 말했지만 그 의미를 완전히 이해하지 못했습니다. 누군가 명확히 해 주실 수 있습니까?

또한 operator=, operator(), operator[]operator-> "이상한"경우 ...? 아니면 을 모두 구현해야합니까? 연산자를 멤버 함수로 오버로드 했습니까? (그렇지 않으면 완벽하게 합법적 인 것이지만 더 나은 방법을 찾고 있습니다.)

+1

또한이 스레드를 참조하십시오 http://stackoverflow.com/questions/3938036/rationale-of-enforcing-some-operators-to-be-members – UmmaGumma

+0

getter/setters는 할당 연산자보다 캡슐화를 중단한다고 생각합니다. 참고 : 클래스를 정의하지 않으면 클래스에 이미 할당 연산자가 있습니다. 시도 해봐. –

+0

구성원 함수는 캡슐화를 중단하지 않습니다. 그들은 그것의 일부입니다. "비회원, 친구가 아닌 기능"을 만드는 환경 설정은보다 간단한 클래스가 될 수 있지만 일반적으로 operator =()를 구현하는 데 필요한 모든 것을 드러내면 operator =()를 멤버로 만드는 것보다 캡슐화가 약화 될 가능성이 큽니다. –

답변

6

클래스에 할당 연산자 (멤버)가없는 경우 컴파일러에서 기본적으로 하나를 생성합니다 복사 생성자를 제공하지 않으면 생성자를 생성합니다.

따라서 비 멤버 할당 연산자를 나중에 정의하려고하면 "분노합니다". 그러면 두 명이 될 것입니다!

+0

비회원을 찾기 위해 규칙을 간단히 변경할 수 있습니다. 하나 먼저. – GManNickG

+0

@GMan 비회원 운영자가 다른 번역 단위에 있다면 어떻게합니까? ODR 위반입니까? –

+0

@ 보 : 합리적인 것 같아. – GManNickG

1

왜 그렇습니까? 하나 선언하지 않는 한

는, 컴파일러는 서명 operator= (C&, C&) 또는 operator= (C&, const C&)와 클래스에 operator=를 선언합니다.

과부하가 허용되면 대부분의 용도가 모호합니다.

그런 다음 당신은 가능성이 추가 규칙에에 대한 로비 것 중 하나

  • 는 사용자가 비회원 operator=이 멤버를 숨 깁니다 것처럼 하나, 볼 선언 된 경우 operator= 선언에는 컴파일러가없는 척 operator=
  • 사용자가 오버로드 중에 더 정확하게 일치하도록 선언하도록하십시오.

두 선택 모두 매우 복잡하고 이미 operator=의 특별한 경우가 추가 된 규칙을 복잡하게 만듭니다.

몇 사람이 거기에 가고 싶습니다.

이 기능에 대한 적법한 사용을 노출하지 않았습니다.

또는 임의의 합리적인 사용.

C++ 규칙은 합리적인 유스 케이스가 표시 될 때만 더욱 복잡해집니다.