簡體   English   中英

非成員運算符重載的含義

[英]What is meant by non-member operator overloading

我最近瀏覽了一篇有關運算符重載的文章,其中提到了非成員運算符重載 如果有人可以舉例說明非成員運算符重載的含義,我將不勝感激。 我知道什么是成員運算符重載(類中的一種方法會重載運算符類型(binary..etc)。我在SO上碰到了這篇帖子 ,這使我相信非成員運算符重載的目的是為了處理運算符重載其中第一個參數不是類而是簡單的本機類型,任何解釋非成員運算符重載的鏈接或示例都將受到贊賞。

這意味着您可以超載:

struct X { int data; };

bool operator<(X const& a, X const& b) 
{
       return a.data < b.data;
}

這對於非對稱重載非常有用,其中左操作數不需要是您自己的類型:

bool operator<(int a, X const& b) 
{
       return a < b.data;
}

這里一個常見的習慣用法是將其與類內定義和朋友聲明相結合:

struct X 
{ 
    int data; 
    friend bool operator<(X const& a, X const& b) { return a.data<b.data; }
    friend bool operator<(int a, X const& b) { return a<b.data; }
};

在這里, operator<在技​​術上仍然不是成員。

如下面的DrewDormann所指出的,此操作的另一個有用的副作用是(X const&, X const&)將適用於任何隱式可轉換為X const&操作數,而不僅僅是該精確類型的表達式。

最常見的方法是重載將在std::cout上調用的operator <<:

namespace X { 
      class MyClass { 
       ...
       };  
}
std::ostream& operator<< (std::ostream&, const X::MyClass&);

這是在std :: ostream成員上調用的,因此您不必在類中定義它。 但是有時功能無法通過公共接口實現(因為您的操作員需要訪問數據表示形式)。

暫無
暫無

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

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