#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 };
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐