2017-11-25 14 views
-1

나는 다른 연산자를 오버로딩하고 무슨 일이 일어나고 있었는지 지켜보기 위해 print 문을 추가했다. 게시물 증가 연산자를 오버로드 할 때 생성자가 두 번 호출되는 것을 보았습니다. 그러나 이유를 이해할 수 없습니다.왜 C++에서 포스트 증가 연산자를 오버로드하면 생성자가 두 번 호출됩니까?

#include <iostream> 
using namespace std; 

class ParentClass { 
    public: 
    ParentClass() { 
     cout << "In ParentClass!" << endl; 
    } 
}; 

class ChildClass : public ParentClass { 
    public: 
     int value; 
     ChildClass() { } 
     ChildClass(int a) 
     : value(a) { 
      cout << "In ChildClass!" << endl; 
     } 

     int getValue() { return value; } 

     ChildClass operator++(int) { 
      cout << "DEBUG 30\n"; 
      this->value++; 
      return this->value; 
     } 
}; 

int main() { 
    cout << "DEBUG 10\n"; 
    ChildClass child(0); 
    cout << "value initial  = " << child.getValue() << endl; 
    cout << "DEBUG 20\n"; 
    child++; 
    cout << "DEBUG 40\n"; 
    cout << "value incremented = " << child.getValue() << endl; 
} 

이 코드를 실행 한 후 출력은 다음과 같습니다

DEBUG 10 
In ParentClass! 
In ChildClass! 
value initial  = 0 
DEBUG 20 
DEBUG 30 
In ParentClass! 
In ChildClass! 
DEBUG 40 
value incremented = 1 
+0

입니다. 코드는 ** post ** - increment 연산자를 오버로드하지만 ** pre ** - increment를 구현합니다. –

+0

@PeteBecker 아마도 내가 뭔가를 놓치고 있습니다. 필자는 ++ 연산자 (int)에 'int'매개 변수를 추가하면 게시 증분을 구현할 수 있다고 생각 했습니까? – yamex5

+1

코드는 증가 된 값을 반환합니다. 이것이 바로 사전 증가입니다. 후행 증가는 원래 값을 반환해야합니다. –

답변

1

return this->value; 

반환 말한다이 문 int

그러나 방법의 프로토 타입은

입니다

그래서 컴파일러는 int이 필요하다고 생각합니다. ChildClass - int에서 하나를 만들 수 있습니다. 따라서 출력은

+0

결과가있는 새 형식이 반환되는 이진 연산자에 대한 예제를 따라했습니다. 나는 return 문을 제거했고 실제로 생성자는 호출되었지만 한 번 호출되었습니다. 또한 반환 유형을 int로 변경하면 작동합니다. 감사! – yamex5

+1

@ yamex5,'ChildClass'의'++'return'int'는'operator ++'의 일반적인 행동을 기대하는 누구에게나 정말 불쾌한 일입니다. 확장을 위해 [연산자 오버로딩의 기본 규칙 및 관용은 무엇입니까?] (https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-and-idioms-for-operator-overloading)를 참조하십시오. 쓰기 작업 과부하. – user4581301

+0

@ user4581301 - 'int'를 반환하지 않습니다. 프로토 타입 및 설명을 참조하십시오. –