首页 > 解决方案 > 我的预增量工作正常,但不是后增量

问题描述

我已经实现了以下类,并尝试重载前置和后置增量运算符以及提取“>>”运算符。程序运行良好,直到 'cout << ++num1;' 但打印最后一行 'cout << num1++;' 的垃圾值。我无法弄清楚为什么它对预增量工​​作正常,但对后增量却不行。

class ComplexNumber
{
private:
    float real;
    float img;
public:
    ComplexNumber();
    ComplexNumber(float, float);
    ComplexNumber(const ComplexNumber& cn);
    friend istream& operator>>(istream& in, ComplexNumber& cn);
    // cin >> complexNo1 >> complexNo2;
    friend ostream& operator<<(ostream& out, const ComplexNumber& cn);
    //cout << complexNo1 << complexNo2; //3+4i, 5+10i
    ComplexNumber& operator++(int);
    //post increment operator. complexNo++;
    ComplexNumber& operator++();
    //pre increment operator. ++complexNo;
ComplexNumber& ComplexNumber::operator++(int x) // postincrement
{
    ComplexNumber c = *this;
    ++(*this);
    return c;
}
ComplexNumber& ComplexNumber::operator++() // preincrement
{
    real++;
    img++;
    return *this;
}
int main()
{
    ComplexNumber num1;//,num2,num3
    cin >> num1;
    cout << "-------------------------------------------" << endl;
    cout << "Complex Number is : ";
    cout << num1;
    cout << ++num1;
    cout << num1++;
}

标签: c++functionclassoperatorsoverloading

解决方案


您的后增量运算符正在返回对本地对象的引用,该对象将在函数结束时被销毁,返回的引用始终悬空,并且对其取消引用会导致 UB。

后增量运算符应该按值返回,例如

ComplexNumber ComplexNumber::operator++(int x) // postincrement
{
    ComplexNumber c = *this;
    ++(*this);
    return c;
}

推荐阅读