3

C++에서 연산자 오버로딩을 배우고 있습니다. 원래 접미어 ++는 대입 연산자보다 우선 순위가 낮다는 속성을가집니다. 예를 들어 int i=0, j=0; i=j++; cout<<i<<j은 01을 출력합니다. 그러나이 속성은 postfix ++에 과부하가 걸렸을 때 손실 된 것으로 보입니다.C++ 연산자 오버로드 접두사/접미사

#include<iostream> 
using namespace std; 

class V 
{ 
public: 
    int vec[2]; 
    V(int a0, int a1) 
    { 
     vec[0]=a0;vec[1]=a1; 
    } 
    V operator++(int dummy) 
    { 
     for(int i=0; i<2; i++) 
     { 
      ++vec[i]; 
     } 
     V v(vec[0],vec[1]); 
     return v; 
    } 
    V operator=(V other) 
    { 
     vec[0]=other.vec[0]; 
     vec[1]=other.vec[1]; 
     return *this; 
    } 
    void print() 
    { 
     cout << "(" << vec[0] << ", " << vec[1] << ")" << endl; 
    } 
}; 

int main(void) 
{ 
    V v1(0,0), v2(1,1); 
    v1.print(); 

    v1=v2++; 
    v1.print(); 
} 

은 (0,0) (1,1)이 예상되는 동안 (0,0) (2,2)을 출력합니다.

이유가 이와 같은 이유와 원래 속성 복원 가능성을 이해하는 데 도움이 될 수 있습니까?

+3

"원래 접미어 ++에는 대입 연산자보다 우선 순위가 낮다는 속성이 있습니다." 낮은 우선 순위가 더 높은 우선 순위보다 강력하게 바인딩된다고 말하는 사람들이 아니라면 틀린 말입니다. 사후 증가의 우선 순위는 할당의 우선 순위보다 높지만 사후 증가는 증가하지 않은 값을 반환합니다. –

+0

오해를 해결해 주셔서 감사합니다. int i = 0, j = 0; i = (j ++); cout << i << j; 01을 출력합니다. 우선 순위가 아니라 반환 메커니즘입니다. – focusHard

답변

1

증분하기 전에 vec[0]vec[1] 사본을 만들어야합니다. 이렇게하면 return v은 증가 된 것보다는 원래의 값을 반환합니다.

V operator++(int dummy) 
{ 
    V v(vec[0],vec[1]); 
    for(int i=0; i<2; i++) 
    { 
     ++vec[i]; 
    } 
    return v; 
} 
4

그것은 인쇄 (0,0)(2,2) 때문에 운영자 ++ 달리 내장 한, 오히려 이전보다, 그것을 증가 후 에 역할을 V 객체의 복사본을 반환합니다.

이것은 조작자에게 과부하가 걸렸을 때 완전히 제어 할 수 있으므로이 점에 관해서는 해당 내장 작동 자처럼 작동하게하는 것은 사용자의 책임입니다. 여기

V operator++(int dummy) 
{ 
    V v(vec[0],vec[1]); // Make a copy before incrementing: we'll return this! 
    for(int i=0; i<2; i++) 
    { 
     ++vec[i]; 
    } 
    return v; // Now this is *not* a copy of the incremented V object, 
       // but rather a copy of the V object before incrementing! 
} 

live example입니다 :

당신이 목표를 달성하기 위해 연산자를 다시 쓸 수있는 방법입니다.