2

當我擡頭看的書籍和堆棧溢出文章operator overloading,我發現:當超載作爲一個類的成員函數時,解引用運算符(*)如何工作?

當重載運算符是一個成員函數,這勢必給 左側操作數。成員操作符函數的參數少於(明確的) 參數的數量。

(艾迪生韋斯利,C++入門)

所以我的問題是,由於*(反引用)操作者沒有任何左操作數,它是如何得到它的參數(這是對象本身或this )?

+0

我沒有找到它指出一個重載的任何可靠來源如果需要,一元運算符成員函數會將右手操作數作爲隱式參數。 – sushrut619

+0

這是一個一元運算符,它對它的值進行操作 – Danh

+0

作爲一個附加問題,如果重載*運算符被定義爲非成員函數vs成員函數,它將會有什麼區別? – sushrut619

回答

2

對於所有的前綴一元運算符,它對它後面的操作數進行操作。

作爲一個附加的問題會有在重載*運算符是如何使用的,如果它被定義爲一個非成員函數Vs的成員函數

在大多數情況下,沒有任何區別,除非非成員函數不能訪問那個類的私有成員,並且如果成員函數和非成員函數都存在,編譯器就需要使用overload resolution來選擇更高等級的函數,如果沒有更好的函數,那麼它是模糊的請參見ADL

對於可靠來源,y OU可在operator overloading看一看,或者更好的,部分13.5.1 [over.unary]在標準C++:

前綴一元運算符,應以非靜態成員函數(9.3)與實施沒有參數或 具有一個參數的非成員函數。因此,對於任何前綴一元操作符@而言,@x可以被解釋爲 或者x.operator @()或者operator @(x)。如果聲明瞭這兩種形式的操作符函數,則13.3.1.2中的規則決定使用哪種解釋(如果有的話)。關於後綴 一元運算符++和 - 的解釋見13.5.7。 2同一個運算符的一元和二元形式被認爲具有相同的名稱。 [注意:因此, 一元運算符可以將一個二元運算符隱藏在封閉範圍內,反之亦然。末端 注]

對於選擇,如果有會員及非會員,請參閱13.3.1.2 [over.match.oper]

0

前綴*對其後的操作數進行操作。

對於用戶定義的operator*表示爲成員函數,這是由this表達式引用的對象。

#include <iostream> 
using namespace std; 

struct S 
{ 
    auto operator*() const -> char const* { return "Hi there!"; } 
}; 

auto main() 
    -> int 
{ cout << *S() << endl; } 

結果:

 
Hi there! 
+0

作爲一個附加問題,如果重載*運算符被定義爲非成員函數vs成員函數,會有什麼區別? – sushrut619

+0

@ sushrut619:這取決於它是如何定義的。爲了模擬一個'const'成員函數,它應該通過值或引用'const'來引用它的參數。否則它不能在'const'參數上調用。 –

0

反引用操作符完全相同的方式作爲重載運算符因爲它作爲一個普通的操作相同。

int foo(int *p) 
{ 
    return *p; 
} 

在聲明return *p;中,引用操作適用於指針p。它傳遞給它的右側:

作爲一個重載操作符,它的工作原理是一樣的。

class bar { 

    int *some_internal_ptr; 

public: 
    int operator*() const { 
      return *some_internal_ptr; 
    } 

    // Other class members and methods... 
}; 

int foo(bar p) 
{ 
    return *p; 
} 

*操作者的右手側是類與操作員*`構件,它被調用作爲該類的一個重載的方法,不超過任何其他成員不同,爲了解決間接引用。

這是因爲使用方法是相同的,這就是爲什麼許多C++庫算法與指針或C++庫操作符一樣可以很好地工作。

template<typename iter_type> 
iter_type copy(iter_type b, iter_type e, iter_type t) 
{ 
    while (b != e) 
    { 
     *t=*b; 
     ++t; 
     ++b; 
    } 
    return t; 
} 

你可以通過本地指針std::copy,或通過類,如迭代器,重載的:例如,std::copy()可以如下(我修剪掉我們在這裏不會有密切關係一些無關痛癢的複雜性)來實現並且因爲使用與普通的運算符相同的語法來使用過載運算符,所以相同的算法也適用於重載運算符。

相關問題