Friend functions method to overload operator is commonly used to overload binary operators. For example:
#include <iostream>
#include <numeric>
class Fraction
{
int m_numerator{};
int m_denominator{};
public:
Fraction() = default;
Fraction(int num, int deno)
: m_numerator{num}, m_denominator{deno}
{
}
static Fraction add(const Fraction &f1, const Fraction &f2)
{
if (f1.m_denominator == f2.m_denominator)
{
return Fraction{f1.m_numerator + f2.m_numerator,
f1.m_denominator};
}
const int numerator{
f2.m_denominator * f1.m_numerator +
f2.m_numerator * f1.m_denominator};
const int denomerator{f1.m_denominator * f2.m_denominator};
return Fraction{numerator, denomerator};
}
friend Fraction operator+(const Fraction &f1, const Fraction &f2);
friend std::ostream &operator<<(std::ostream &out, const Fraction &f)
{
return out << f.m_numerator << "/" << f.m_denominator;
}
};
Fraction operator+(const Fraction &f1, const Fraction &f2)
{
return Fraction::add(f1, f2);
}
int main(int argc, char const *argv[])
{
Fraction f1{1, 2};
Fraction f2{3, 1};
std::cout << (f1 + f2) << '\n';
return 0;
}Here, we are trying to add two Fraction objects by overloading operator+ function that accepts two Fraction type parameters.
If we want to add an int to fraction, we need to overload operator+ for parameter which accepts Fraction and int parameters. For example:
class Fraction
{
...
public:
...
friend Fraction operator+(const Fraction &f1, int value);
friend Fraction operator+(int value, const Fraction &f1);
};
Fraction operator+(const Fraction &f1, int value)
{
return Fraction::add(f1, Fraction{value, value});
}
Fraction operator+(int value, const Fraction &f1)
{
return Fraction::add(f1, Fraction{value, value});
}We have added two more overloads for both cases where Fraction and int can be used in any order.