2010-05-14 55 views
0

在C++中我有以下代碼如何調用在C++運算符()

class Foobar{ 
public: 
    Foobar * operator()(){ 
     return new Foobar; 
}; 

我quesion是如何調用(); 如果我做的Foobar FOO()構造函數被調用 我感到困惑的行爲() 可一些解釋我

回答

5

雖然GMAN的回答是真實,正確,你永遠不應該重載運營商做一些意想不到的 - 這就違背了所有的好做法編程規則。當用戶閱讀代碼時,他希望操作員以某種方式表現行爲,並使其行爲不同,僅適用於混淆編碼競爭。

C++中的()運算符可用於使對象表示函數。這實際上有一個名稱 - 它被稱爲仿函數,並廣泛用於STL中以提供通用算法。谷歌stl函子瞭解這項技術的良好用法。

+0

這不是'operator()'唯一常見的用法。它也用於鏈接。 'boost :: program_options'通過'options_description_easy_init :: operator()()'演示了一個很好的例子(但客戶端只處理'options_description :: add_option()',它返回可鏈接類型)。您可以使用它來爲一個接一個的命令行選項添加支持。爲了同樣的目的,使用'operator <<'和'operator >>'也很常見。 'std :: cout'和'std :: cin'就是這裏的典型例子。這三者之間的選擇通常是美學的選擇。 – wilhelmtell 2010-05-14 06:16:23

+0

儘管你對一般操作符肯定是正確的(不要重複'+'來完成'* ='的工作),但對我來說,似乎'operator()()'是個例外。它的用途是模仿一個函數,函數被用來做任何事情,所以對'operator()()'的用法沒有限制。儘管你的頭像很好,但是這使得我的-1。 ':)' – sbi 2010-05-14 07:09:37

5

像這樣:

Foobar f; 
Foobar* p = f(); // f() invokes operator() 
delete p; 

而且這是很奇怪的,在返回像這樣的指針的條件,它是一個相當無用的函數。 (我「需要」一個Foobar做出一個新的)

+8

我會添加你*不應該這樣做的限定*。從'operator()'返回一個'new'實例真的很奇怪,並且是非慣用的! – 2010-05-14 05:54:32