찾을 코드가 모두 접두사 연산자에 오버로드 될 때 참조 변수를 반환 할 때 혼란 스럽습니다. 나는 parashift.com FAQ (http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14)를 훑어 보았지만 명확하지 않다고 밝혀졌지만 명확하지 않습니다. 당신이 그것을 읽을 때. 나는 그들의 예를 테스트 할 무분별하고 무의미한 작은 프로그램에 적용했다.C++ 접두사 오버로드에서 참조 변수를 반환합니다.
#include<iostream>
using namespace std;
class Number {
public:
Number operator++(); // prefix ++
Number operator++ (int); // postfix ++
int value() { return value_; }
void setValue(int value) { value_ = value; }
private:
int value_;
};
Number Number::operator++() {
++value_;
return *this;
}
Number Number::operator++ (int unused) {
Number temp;
temp.setValue(value_);
++value_;
return temp;
}
int main()
{
Number someNum;
someNum.setValue(20);
cout << "someNum : " << someNum.value() << "\n";
someNum++;
++someNum;
cout << "someNum : " << someNum.value() << "\n";
return 0;
}
나는 단순히 참조 변수의 더 나은 이해를 필요로 가정
#include<iostream>
using namespace std;
class Number {
public:
Number& operator++(); // prefix ++
Number operator++ (int); // postfix ++
int value() { return value_; }
void setValue(int value) { value_ = value; }
private:
int value_;
};
Number& Number::operator++() {
++value_;
return *this;
}
Number Number::operator++ (int unused) {
Number temp;
temp.setValue(value_);
++value_;
return temp;
}
int main()
{
Number someNum;
someNum.setValue(20);
cout << "someNum : " << someNum.value() << "\n";
someNum++;
++someNum;
cout << "someNum : " << someNum.value() << "\n";
return 0;
}
문제는 내가 너무 좋아뿐만 아니라 Number 객체로 선언하는 경우 작동입니다. 누구나 접두어 연산자가 왜 참조 변수를 반환하도록 코드화되어야하는지 간단하게 설명 할 수 있습니까?
그래서 두 번째 방법은 후행 증가분과 비교할 때 더 적절합니다. ((someNum ++) ++) ++ 또한 someNum 만 증가시킵니다! 따라서 포스트와 사전 증가 연산자의 의미가 비교 될 수 있기 때문에 사본을 반환하는 것이 더 좋을 것입니다. – mmmmmmmm
@ RüdigerStevens : 사실이 아닙니다. 후행 증분은 정의에 따라 임시로 반환해야합니다. 왜냐하면 반환 된 객체와 원래 객체는 다른 값을 갖기 때문입니다. 그러나 사전 증가의 경우 반환 객체와 원래 객체는 동일한 값을 갖습니다. 따라서 사전 증가 연산자에서 임시를 생성 한 다음 반환하는 것은 중요하지 않습니다. – Nawaz
설명은 좋습니다 ... 링크가 작동하지 않습니다. :) –