利用普通函數多載運算子

在前一章 利用 Friend 多載運算子 中,我們講到了有三種方法可以多載運算子,在那一章中,我們介紹了如何用 Friend 多載運算子。

這章我們要來看看第二個方法,也就是利用普通函數多載運算子!

實作

在前一章中,我們已經討論過為什麼我們會需要去多載一個運算子了。

因此這章,我們就跳過那些已經討論過的問題,直接來看如何實作。

這邊我們繼續利用前一章的例子,並附上使用 Friend 的方法來相互比較。

利用 Friend
class Money
{
private:
    int _dollars {};

public:
    Money(int dollars) : _dollars{ dollars } {}
    int getDollars() const { return _dollars; }
    
    friend Money operator+(const Money& m1, const Money& m2);
};

Money operator+(const Money& m1, const Money& m2)
{
    return m1._dollars + m2._dollars;
}

int main()
{
    Money money1{ 1 };
    Money money2{ 2 };
    Money money3{ money1 + money2 };
    std::cout << money3.getDollars() << std::endl;

    return 0;
}
利用普通函數
class Money
{
private:
    int _dollars {};

public:
    Money(int dollars) : _dollars{ dollars } {}
    int getDollars() const { return _dollars; }
};

Money operator+(const Money& m1, const Money& m2)
{
    return m1.getDollars() + m2.getDollars();
}

int main()
{
    Money money1{ 1 };
    Money money2{ 2 };
    Money money3{ money1 + money2 };
    std::cout << money3.getDollars() << std::endl;

    return 0;
}

我們可以看到,其實基本上沒有什麼差!

差別只在於這個 operator+ 函數有沒有能力可以直接取得我們的成員特徵 _dollars 而已!

該使用那種方式

如果利用 Friend 和利用普通函數這兩種方式長的樣子幾乎一樣的話,那麼我們該使用哪一種方式呢?

一般來說,使用普通函數會比使用 Friend 來的好!

這是因為利用普通函數,你並不需要實際去更改已經存在的類別。有時候甚至那個類別並不是你寫的,你也無權更改。

而且多數時候,類別都會提供 getter API 可以讓我們從外部存取類別內部資料,因此使用普通函數是完全可行的!

總結

這篇我們又學到了一個新的方法來多載一個運算子了!

這章相對簡短,因為前言以及遇到的問題等等都已經在前一章 利用 Friend 多載運算子 講過了,所以這篇只著重於實作。

那麼下一章我們就會來提到最後一種多載運算子的方法!

那這篇就到這裡啦!有學到東西的話可以留五星評價喔!