簡體   English   中英

重載操作符作為成員函數還是非成員(朋友)函數?

[英]Overload operators as member function or non-member (friend) function?

我目前正在創建一個實用程序類,它將在其中重載運算符。 使它們成為會員或非會員( friend )功能的利弊是什么? 或者它是否重要? 也許這是一個最好的做法?

我將使用“C ++編碼標准:101規則,指南和最佳實踐”:如果您可以將其作為非成員函數執行,則將其作為非成員函數(在同一名稱空間中)執行。

其中一個原因是:它在隱式類型轉換中效果更好。 示例:您有一個帶有重載運算符*的復雜類。 如果要編寫2.0 * aComplexNumber,則需要operator *作為非成員函數。

另一個原因:耦合較少。 非成員函數與成員函數的耦合程度較低。 這幾乎總是一件好事。

每個運營商都有自己的考慮因素 例如,<<運算符(用於流輸出,而不是位移)將獲取ostream作為其第一個參數,因此它不能是您的類的成員。 如果您正在實施加法運算符,您可能希望從雙方的自動類型轉換中受益,因此您也將使用非成員等等...

至於允許通過繼承進行專門化,常見的模式是根據虛擬成員函數實現非成員運算符(例如,operator <<在被傳遞的對象上調用虛函數print())。

如果您計划實現流操作符(<<和>>),那么它們將是非成員方法,因為您的對象位於運算符的左側。

如果您計划實現 - >,()或[],它們自然是成員方法。

對於其他人(比較和數學),你應該檢查Boost.Operators ,它真的有幫助。

例如,如果要實現以下運算符:

MyClass& MyClass::operator+=(int);
MyClass operator+(const MyClass&, int);
MyClass operator+(int, const MyClass&);

你只需要寫:

class MyClass: boost::operator::addable<MyClass,int> // no need for public there
{
public:
  MyClass& operator+=(int);
private:
};

2 operator+將自動生成為非會員,這將使您從自動轉換中受益。 並且它們將在operator+=有效地實現,因此您只需編寫一次代碼。

如果你正在實現op,那么很可能你需要實現op =。 即如果你正在重載+運算符,那么你應該實現+ =。 如果您正在進行后增量或重載+運算符,請確保將const返回到對象。 因此,如果重載operator +,則將其實現為非成員運算符,並在其中使用+ =運算符。 例如。

const A operator+(const A& lhs, const A& rhs)
{
   A ret(lhs);
   ret += rhs;
   return ret;
}

對於二元運算符,成員函數的一個限制是左對象必須是您的類類型。 這可以限制使用操作員對稱。

考慮一個簡單的字符串類:

class str
{
public:
    str(const char *);
    str(const str &other);
};

如果將operator +作為成員函數實現,而str("1") + "2"將編譯,則"1" + str("2")將無法編譯。

但是如果你將operator +作為非成員函數實現,那么這兩個語句都是合法的。

沒有什么比最佳實踐更好但它取決於您正在超載的運營商..

例如。

  1. >><<不能作為成員函數重載。

  2. 假設你想這樣做: obj1 = 2 * obj2然后去非成員函數

對於二元運算符重載,成員函數只需要1個參數(調用對象被非常傳遞),而非成員函數需要2個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM