所以我创建了这个可以添加两个对象的两个值的类。我真正理解的是在运算符函数中,分子和分母的值是否来自int main()中的对象no1?
class frac
{
public:
frac operator+(frac&);
frac();
frac(int, int);
int numerator;
int denominator;
};
frac frac::operator+(frac& tmp)
{
frac tmpResult;
tmpResult.numerator = numerator + tmp.numerator;
tmpResult.denominator = denominator + tmp.denominator;
return tmpResult;
}
int main()
{
frac no1(2, 5);
frac no2(3, 6);
frac result = no1 + no2;
return 0;
}
答案 0 :(得分:1)
分子和分母的值是否来自int main()?
中的对象no1
是
答案 1 :(得分:1)
是的,它被定义为成员函数,因此它等同于调用
no1.operator+(no2);
您希望将参数类型更改为const
引用,因为您实际上并不想修改右侧。你想修好你的数学。
注意你也可以使用免费功能
frac operator+(const frac& lhs, const frac& rhs) { ... }
对某些人(包括我)来说,这似乎更自然。
答案 2 :(得分:0)
是的,你是对的。可以在类方法中访问类成员,而无需指定其原点(就好像它们是在本地声明的)。
frac frac::operator+(frac& tmp)
{
frac tmpResult;
tmpResult.numerator = numerator + tmp.numerator;
tmpResult.denominator = denominator + tmp.denominator;
return tmpResult;
}
此代码可以重写为:
frac frac::operator+(frac& tmp)
{
frac tmpResult;
tmpResult.numerator = this->numerator + tmp.numerator;
tmpResult.denominator = this->denominator + tmp.denominator;
return tmpResult;
}
PS:我相信你的意思是运营商超载。
编辑:当你处理错误的分数时,我有这种纠正你的数学的冲动。
分数加法(和分别减法)可以这样做:
frac frac::operator+(frac& tmp)
{
int common_denominator = tmp.denominator * this->denominator;
int common_numerator = tmp.numerator * this->denominator + this->numerator * tmp.denominator;
//You can add simplification by dividing these
//two above with their greatest common divisor
//in order to avoid cases like 111/222 which can
//be represented as 1/2. (this is optional)
return frac(common_numerator, common_denominator)
}
答案 3 :(得分:0)
是。分子和分母的值来自对象1号。
为了您的理解,您也可以将其写为:
frac result = no1.operator+( no2 );
答案 4 :(得分:0)
你的main()可以被重写为更明确:
int main()
{
frac no1(2, 5);
frac no2(3, 6);
frac result = no1.operator+( no2 );
return 0;
}
此代码是等效的,但可以更容易理解哪个对象指针作为此传递给operator +
答案 5 :(得分:0)
忽略您的数学错误......
当您将重载运算符声明为成员函数时,假定第一个参数为this
。也就是说,no1 + no2
只是no1.operator+(no2)
的简写。因此,该函数会从当前numerator
对象中看到denominator
和no1
(因为它位于左侧)。
或者,您也可以这样声明函数:
class frac
{
// class declaration
friend frac operator+(const frac& lhs, const frac& rhs);
};
frac operator+(const frac& lhs, const frac& rhs)
{
// implement fraction addition for lhs + rhs
}