C++ 运算符覆盖

C++ operators overriding

你能解释一下为什么这段代码不起作用吗? 运算符+覆盖:

Fraction& Fraction::operator+(const Fraction& f) {
    Fraction temp;
    if (this->denominator == f.denominator){
        temp.numerator = this->numerator + f.numerator;
        temp.numerator = this->numerator;
        temp.simplifier();
    }
    else {
        temp.numerator = this->numerator * f.denominator + f.numerator * this->denominator;
        temp.denominator = this->denominator * f.denominator;
        temp.simplifier();
    }
    return temp;
}

运算符=覆盖:

void Fraction::operator=(const Fraction& f) {
    this->numerator = f.numerator;
    this->denominator = f.denominator;
}

代码后

Fraction res;
res = f + g;

资源的字段保持未初始化状态。 但是,例如,代码

Fraction res = g; 

工作正常。所以 operator= 不能将 (f + g) 理解为一个对象? 谢谢

问题是您的重载正在返回对对象 temp 的引用,该对象在函数 returns.

时被销毁

在函数 returns 之后访问该对象未定义。

Return 按值代替:

Fraction Fraction::operator+(const Fraction& f)

Fraction res = g; 

不是赋值而是初始化,不会使用您的赋值运算符。

您正在返回对在堆栈上创建的临时文件的引用。 "temp",在 operator+ 中,其生命周期在 operator+ returns 时结束。下次调用方法时,其内容可能会以混乱的方式更改。

除了return对临时文件的引用之外,您遇到的另一个问题是:

    if (this->denominator == f.denominator){
        temp.numerator = this->numerator + f.numerator;
        temp.numerator = this->numerator;  // *HERE*
        temp.simplifier();
    }

我很确定标有 *HERE* 的行应该是:

        temp.denominator = this->denominator;

否则你会用一个未初始化的分母调用简化器,就会发生不好的事情。

我还建议制作 operator + 一个独立的二元运算符,它接受两个 Fraction 个参数 - 并使用 operator +=。注意:lhs 作为副本传递,而不是 作为常量引用。

Fraction operator +(Fraction lhs, const Fraction &rhs)
{
    lhs += rhs;
    return lhs;
}

如果您想 return "temp" 作为参考,那么您必须将 "temp" 声明为:

static Fraction temp;

现在一切正常。为什么因为在声明之前附加 static 关键字使得 "temp" 在程序终止之前可用..