【问题标题】:My pre increment is working fine but not the post increment我的预增量工作正常,但不是后增量
【发布时间】:2021-07-28 08:12:12
【问题描述】:

我已经实现了以下类,并尝试重载前置和后置增量运算符以及提取“>>”运算符。程序运行良好,直到 'cout

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++;
}

【问题讨论】:

  • @RichardCritten 你能告诉 & 运算符在这里做什么以及它对输出有什么影响
  • 非常感谢您的工作!
  • 如果出现警告,编译器通常会对此发出警告。

标签: c++ function class operators overloading


【解决方案1】:

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

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

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

【讨论】:

  • 如果 & 是在函数的返回类型中的强制要求,是否有任何替代方法?
  • 替代方法可以是任何不返回对被破坏的本地对象的引用的方法。您不能在 C++ 中返回对本地对象的引用。它不起作用。
  • @MuhammadArslanWaqar 你可以,但这不是一个好主意。引用返回对于后增量运算符没有多大意义。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多