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" 在程序终止之前可用..
你能解释一下为什么这段代码不起作用吗? 运算符+覆盖:
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" 在程序终止之前可用..