我正在为学习目的制作一个分数课程。为了添加函数,我重载了+运算符。第一个采用一个分数作为第二个参数,第二个函数采用int作为第二个参数。虽然可以从另一个函数中调用其中一个函数,但这是一个关于性能的好习惯吗?
Fraction Fraction::operator+(const Fraction& r_oper) {
int l_lcm{Fberlanga::Math::lcm(this->denominator(),r_oper.denominator())};
Fraction fr(l_lcm*this->numerator() / this->denominator() + l_lcm*r_oper.numerator() / r_oper.denominator(),l_lcm);
fr.simplify();
return fr;
}
Fraction Fraction::operator+(int r_oper) {
Fraction fr{r_oper,1}; // create fraction of the form r_oper / 1
fr = (*this) + fr; // call the other version that takes a fraction as 2nd parameter
//fr.simplify(); no need, it simplifies when calls the other function
return fr;
}
答案 0 :(得分:2)
它绝对不是最佳的,但这种类型的代码结构是一种常见的做法,尽管我个人认为在这种情况下它不是一个好的决定。
关于表现:
重写可能看起来像:
Fraction Fraction::operator+(int r_oper) {
Fraction fr(this->numerator() + this->denominator() * r_oper, this->denominator());
// fr.simplify(); <-- Even this is redundant!!!
return fr;
}
这是一个非常简单的逻辑,我非常怀疑任何编译器都可以优化掉所有相关部分。
缺点可能是如果你改变你的结构或逻辑,你不得不修改2个函数而不是1.但是,考虑到所涉及的复杂性(重写可能是一个非常简单的事情)我&#39;在这种情况下,请使用详细/优化版本。
P.S。如果您决定坚持使用您的版本,int
版本可以返回(*this) + fr
,而无需简单地分配;
答案 1 :(得分:0)
答案是:也许。
如果您正在使用编译器内联,那么它的概率也一样快。您可以通过在声明变量时声明类声明中的operator
或在返回类型之前使用inline
声明符来执行此操作:
class Fraction
{
....
inline operator+(...);
....
};
注意,如果使用内联,则定义必须位于头文件中。
如果您正在使用链接(将该函数放在.cpp文件中),那么它就没有那么快,因为链接到函数会增加一点点开销。
无论使用哪种方式,仍然强烈建议在其他运算符内调用运算符,因为它更易读,更易维护,物理代码更少。