Nice programing

왜 '.'를 오버로드 할 수 없습니까?

nicepro 2020. 10. 16. 08:05
반응형

왜 '.'를 오버로드 할 수 없습니까? 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 objis a class object then obj.mhas a meaning for every member mof 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

반응형