왜 '.'를 오버로드 할 수 없습니까? C ++의 연산자?
.NET Framework를 오버로드 할 수 있으면 매우 유용 할 것입니다. C ++에서 연산자를 사용하고 개체에 대한 참조를 반환합니다.
당신은 오버로드 할 수 operator->
및 operator*
하지만operator.
이에 대한 기술적 이유가 있습니까?
Bjarne Stroustrup의이 인용문을 참조하십시오 .
운영자 . (점)은 원칙적으로->에 사용 된 것과 동일한 기술을 사용하여 오버로드 될 수 있습니다. 그러나 이렇게하면 작업이 개체 오버로딩을위한 것인지에 대한 질문으로 이어질 수 있습니다. 또는에서 참조하는 객체. 예를 들면 :
class Y { public: void f(); // ... }; class X { // assume that you can overload . Y* p; Y& operator.() { return *p; } void f(); // ... }; void g(X& x) { x.f(); // X::f or Y::f or error? }
이 문제는 여러 가지 방법으로 해결할 수 있습니다. 표준화 당시에는 어떤 방법이 가장 좋을지 분명하지 않았습니다. 자세한 내용은 The Design and Evolution of C ++를 참조하십시오 .
Stroustrup은 C ++는 확장 가능해야하지만 변경 불가능한 언어 여야한다고 말했습니다.
도트 (속성 액세스) 연산자가 언어 핵심에 너무 가까워서 오버로딩을 허용하지 않는 것으로 나타났습니다.
참조 디자인 및 C의 진화 ++ , 242 페이지, 섹션 11.5.2 스마트 참조를 .
operator의 오버로딩을 허용하기로 결정했을 때
->
, 나는 자연스럽게 operator.
가 비슷하게 오버로드 될 수 있는지를 고려했습니다 .그 당시 나는 다음과 같은 주장을 결정적으로 고려했다. If
obj
is a class object thenobj.m
has a meaning for every memberm
of the object 's class. 우리는 내장 연산을 재정의함으로써 언어를 변경 가능하게 만들지 않으려 고 노력합니다 (비록=
절박하고 단항의 경우 규칙이 위반되지만&
).
.
클래스 에 대한 오버로드를 허용하면 정상적인 방법으로의X
멤버에 액세스 할 수 없습니다X
. 우리는 포인터를 사용해야->
하지만,->
및&
도 다시 정의되어있을 수 있습니다. 저는 변경 가능한 언어가 아닌 확장 가능한 언어를 원했습니다.이러한 주장은 중요하지만 결정적이지는 않습니다. 특히 1990 년에 Jim Adcock은 운영자가
.
정확히 운영자 와 같은 방식으로 운영자의 과부하를 허용하도록 제안했습니다->
.
이 인용구의 "I"는 Bjarne Stroustrup입니다. 당신은 그것보다 더 권위있을 수 없습니다.
C ++를 정말로 이해하고 싶다면 ( "왜 이런 식입니까")이 책을 반드시 읽어야합니다.
Stroustrup 은이 질문에 대한 답을 가지고 있습니다 .
운영자 . (점)은 원칙적으로->에 사용 된 것과 동일한 기술을 사용하여 오버로드 될 수 있습니다. 그러나 이렇게하면 작업이 개체 오버로딩을위한 것인지에 대한 질문으로 이어질 수 있습니다. 또는에서 참조하는 객체. 예를 들면 :
class Y { public: void f(); // ... }; class X { // assume that you can overload . Y* p; Y& operator.() { return *p; } void f(); // ... }; void g(X& x) { x.f(); // X::f or Y::f or error? }
이 문제는 여러 가지 방법으로 해결할 수 있습니다. 표준화 당시에는 어떤 방법이 가장 좋은지 분명하지 않았습니다. 자세한 내용은 D & E를 참조하십시오 .
It is very easy to understand, if you go through the internal mechanism of operator function invocation, Say a class complex can have two member r for real part and i for imaginary part. Say Complex C1(10,20),C2(10,2) // we assume there is an already a two argument constructor within class. Now if you write C1+C2 as a statement then compiler try to find the overloaded version of + operator on complex number. Now we assume that I overload + operator, so C1+C2 internally translated as c1.operator+(c2) Now assume for the time beings you can overload '.' operator. so now think following call C1.disp()//display content of a complex object Now try to represent as an internal representation C1.operator.(------) , completely messy things created. That is the reason why we can't overload '.' operator
참고URL : https://stackoverflow.com/questions/520035/why-cant-you-overload-the-operator-in-c
'Nice programing' 카테고리의 다른 글
Android의 TextView에서 텍스트를 감싸는 방법 (0) | 2020.10.16 |
---|---|
x86 페이징은 어떻게 작동합니까? (0) | 2020.10.16 |
JQuery html () 대 innerHTML (0) | 2020.10.16 |
Nuspec에서 특정 종속성 버전을 지정하는 방법은 무엇입니까? (0) | 2020.10.16 |
vdso와 vsyscall은 무엇입니까? (0) | 2020.10.16 |