利用普通函數多載運算子
在前一章 利用 Friend 多載運算子 中,我們講到了有三種方法可以多載運算子,在那一章中,我們介紹了如何用 Friend 多載運算子。
這章我們要來看看第二個方法,也就是利用普通函數多載運算子!
實作
在前一章中,我們已經討論過為什麼我們會需要去多載一個運算子了。
因此這章,我們就跳過那些已經討論過的問題,直接來看如何實作。
這邊我們繼續利用前一章的例子,並附上使用 Friend 的方法來相互比較。
利用 Friendclass 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 可以讓我們從外部存取類別內部資料,因此使用普通函數是完全可行的!
盡量使用普通函數去實做 operator overloading!
總結
這篇我們又學到了一個新的方法來多載一個運算子了!
這章相對簡短,因為前言以及遇到的問題等等都已經在前一章 利用 Friend 多載運算子 講過了,所以這篇只著重於實作。
那麼下一章我們就會來提到最後一種多載運算子的方法!
那這篇就到這裡啦!有學到東西的話可以留五星評價喔!