C++进阶:使用友元函数重载算术运算符

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值