2017-05-29 24 views
2

我有一個類似於句柄的「智能指針」。operator()括號是否在函數調用中創建的對象上調用?

#define DEST 123 

HANDLE OpenHandle(int dest); 
class SmartHandle; 
void SendMsg(HANDLE dest_handle); 

SendMsg(SmartHandle(OpenHandle(DEST))) 

這個構造經常在我的代碼中使用,所以它工作,但我不明白爲什麼。

OpenHandle(DEST)返回的句柄「智能指針」類

SendMsg - 採用相同類型的參數是由OpenHandle回報這是一個簡單的HANDLE又名void*

對於這個東西的工作,它的確如此,它意味着HANDLE SmartHandle::operator()被調用。

問題

爲什麼HANDLE SmartHandle::operator()被調用?

看代碼,我只想說創建了一個類型爲SmartHandle的對象,並且沒有任何返回,然後調用析構函數SmartHandle

+0

不是萬能的,看起來像'運算符()'實際上是'操作符()',這將是太容易:P – user463035818

回答

6

不,一個調用,如:

HANDLE h; 
SmartHandle(h); 

不調用SmartHandle::operator()。相反,它會創建一個類型爲SmartHandle的臨時對象,並使用h參數進行構造。也就是說,它調用構造函數SmartHandle::SmartHandle(HANDLE)

您的代碼有效,因爲您的課程極有可能有operator HANDLE()將您類型的對象轉換回HANDLE。所以,你的代碼做這樣的操作順序:

{ 
    HANDLE tmp1 = OpenHandle(DEST); 
    SmartHandle tmp2(tmp1); 
    HANDLE tmp3 = tmp2.operator HANDLE(); 
    SendMsg(tmp3); 
}  //at the end of the full sentence temporaries are destroyed. 
+0

是的,你是正確的它確實有'運算符HANDLE()'但是如何以及爲什麼要調用該函數? – Adrian

+0

也是'HANDLE operator()'與'operator HANDLE()'不同嗎? – Adrian

+1

這是因爲你的''SendMsg''方法需要一個''HANDLE'',但它會得到一個''SmartHandle''。有兩種選擇:''SmartHandle''有一個''操作符HANDLE()''將其轉換爲''HANDLE''或''HANDLE''具有一個帶有''SmartHandle''的轉換構造器。由於第一個是真的,所以調用操作員。否則,由於類型不同,它會是編譯錯誤。 –

相關問題