#include <numeric> // for std::gdb
#include <iostream>
class Fraction
{
private:
int m_numerator {};
int m_denominator { 1 };
public:
explicit Fraction(int numerator, int denominator)
: m_numerator{ numerator }, m_denominator{ denominator }
{
}
friend Fraction operator*(const Fraction& f1, const Fraction& f2);
friend Fraction operator*(const Fraction& f1, int value);
friend Fraction operator*(int value, const Fraction& f1);
void print() const;
};
Fraction operator*(const Fraction& f1, const Fraction& f2)
{
Fraction temp{ 0, 1 };
temp.m_numerator = f1.m_numerator * f2.m_numerator;
temp.m_denominator = f1.m_denominator * f2.m_denominator;
return temp;
}
Fraction operator*(const Fraction& f1, int value)
{
Fraction temp{ 0, 1 };
temp.m_numerator = f1.m_numerator * value;
temp.m_denominator = f1.m_denominator;
return temp;
}
Fraction operator*(int value, const Fraction& f1)
{
Fraction temp{ 0, 1 };
temp.m_numerator = f1.m_numerator * value;
temp.m_denominator = f1.m_denominator;
return temp;
}
void Fraction::print const()
{
std::cout << m_numerator << "/" << m_denominator << '\n';
}
int main()
{
Fraction f1{ 1, 4};
f1.print();
Fraction f2{ 1, 2 };
f2.print();
Fraction f3{ f1 * f2 };
f3.print();
Fraction f4{ 2 * f1 };
f4.print();
Fraction f5{ f1 * 3 };
f5.print();
Fraction f6{ Fraction{1, 2} * Fraction{2, 3} * Fraction{3, 4} };
f6.print();
return 0;
}
为什么使用显式构造函数?
例子:
Fraction f4{ 2 * f1 };
非显式Fraction(int, int)构造函数将用于从 2构造一个新的Fraction。然后使用运算符Fraction * Fraction将这个新的Fraction 与f1相乘。
因为这需要转换2为Fraction,所以这比使用整数乘法的重载运算符的实现稍微慢一些。
改进:
Fraction operator*(const Fraction& f1, const Fraction& f2)
{
Fraction temp{ 0, 1 };
temp.m_numerator = f1.m_numerator * f2.m_numerator;
temp.m_denominator = f1.m_denominator * f2.m_denominator;
return temp;
}
Fraction operator*(const Fraction& f1, const Fraction& f2)
{
return Fraction { f1.m_numerator * f2.m_numerator, f1.m_denominator * f2.m_denominator };
}
1389

被折叠的 条评论
为什么被折叠?



