2011-05-13 7 views
1

C#에서는 연산자 오버로드의 메서드 (함수)가 staticpublic이어야합니다.C++ 연산자 오버로드

나는 그것이 static으로 만드는 것이 좋은 것인데, 모든 객체는 그것의 버전을 필요로하지 않는다.

그러나 C++에서는 static 일 필요는 없습니다. C#이 이것을 시행하고 C++이 시행하지 않는 이유는 무엇입니까?

두 디자인의 장점과 단점은 무엇입니까?

+2

연산자 오버로드 C 정적이 될 수 ++. –

+2

그리고 연산자가 정적이 아니더라도 모든 객체가 * 코드의 사본을 가지고 있다는 것을 알지 못합니다 * –

+0

@Neil : 나는 그것이 "정적"일 수 없다고 말하지 않았습니다. 묻는 것은 왜 컴파일러가 C#처럼 "정적"으로 만들지 않는지입니다. – Sherif

답변

2

왜 C++에서 연산자 오버로딩이 "정적"으로 적용되지 않습니까?
오버로드 된 연산자 함수를 정적으로 만들면 this에 액세스 할 수 없습니다. 일반적으로 함수는 this 상태를 변경하므로 오버로드 된 함수 내에 this에 대한 액세스 권한이 필요합니다.

해당 함수 내에 this에 액세스 할 필요가없는 경우 오버로드 된 연산자 함수 static을 만들 수 있습니다. 이는 본질적으로 연산자 함수가 호출 된 객체의 상태를 조작하지 않는다는 것을 의미합니다. 그렇기 때문에 그것은 보통의 것이거나 본질적으로 바람직한 것이 아닙니다.

전역 오버로드 된 연산자 함수를 정적으로 만들면 연산자 함수의 범위가 동일한 파일로 제한됩니다.

위의 두 가지를 모두 감안할 때 Compiler는 과부하 된 연산자 함수를 강제로 시행하지 않으므로 실제 이점이나 편리함을 제공하지 않으므로 동일한 기능을 강화하지 않으면 더 많은 편리 성을 제공합니다.

왜 C#은 연산자 오버로딩을 "정적"으로 설정합니까?
This은 내가 할 수있는 것보다 훨씬 잘 설명합니다.

장점과 단점은 무엇입니까?
첫 번째 질문에 대한 대답은 과부하 된 연산자 기능을 장점/단점을 설명하는 정적 인 &으로 만들 수 있다고 말합니다.

+0

내 질문을 재구성했습니다. – Sherif

1

왜 C#은 오버로드 된 연산자를 static으로 강제 설정합니까?

저는 C# 디자이너가 아닙니다. 잠재적 인 이유는 C++의 경험에 따르면 운영자의 논쟁 사이에 비대칭 성을 갖는 것이 (회원 diadic 운영자의 직접적인 결과 인) 나쁜 생각이라는 것을 보여주었습니다.

왜 C++은 오버로드 된 연산자를 static으로 지정하지 않습니까?

빌드 할 이전 경험이 없었기 때문에 좋은 생각 이었습니까? (연산자 오버로딩을 사용하는 C++ 이전의 몇 가지 언어 중 하나 인 Algol68에서는 구별이되지 않습니다 .BTW C++은 연산자 오버로딩에서 Algol68 실수를 반복하지 않았습니다.)

+0

죄송 합니다만, 저는이 부분을 "운영자의 논쟁 사이의 비대칭 성 (회원 diadic 운영자의 직접적인 결과 임) 사이의 비대칭 성은 나쁜 생각"이라고 이해하지 못합니다. – Sherif

+0

@mavric 종종 연산자는 교환 가능합니다. 즉 a + b는 b + a와 같습니다. 하나의 인수가 특별하면 (구성원이 호출되는 객체) 언어 규칙에 따라 commutativity를 달성하기 어려워집니다. 예를 들어 C++에서는 암시 적 변환을 사용할 수 없습니다. – AProgrammer

+0

그래서 컴파일러는 모든 연산자 오버로딩 메서드가 객체 데이터를 보호하는 것이 아니라 값을 반환해야한다는 것을 강제하기 위해 정적으로 적용하도록 규정합니다. – Sherif

0

나는 C#이 그것을 더 잘 이해하기 때문에 그것을 강요한다고 잘못 생각하지는 않는다.
두 개의 객체를 추가 할 때 this 매개 변수를 이해하기가 어려웠으므로 복잡성을 줄이기 위해이를 적용한다고 생각하지만 연산자가 정적이 아니고 이해하기 쉽다는 것은 아무 문제가 없습니다.

1

다른 언어이기 때문에. 나는 C#을 모르므로 에 대한 코멘트가 너무 많지만 C++에서는 []() (복사 지정 연산자는 제외)과 같은 일부 연산자는 정적 일 수 없습니다. 원인. 그리고 일반적으로 연산자가 정적이되기를 원하는 이유는 무엇입니까? 나는 C++에서 연산자를 정적으로 만든 적이 없다고 생각합니다. 클래식 이진 산술 연산자는 일반적으로 자유 함수이며 다른 모든 연산자 멤버입니다. (하나는 회원 또는 무료 기능으로 operator++에 대한 더 있는지 여부를 주장 할 수 있지만, 가장 넓은 확산 연습은 그 구성원 할 것 같다.)