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.

References

  1. https://www.learncpp.com/cpp-tutorial/overloading-the-arithmetic-operators-using-friend-functions/