2011-09-28 55 views
0

這似乎是一個愚蠢的問題,但我從來沒有見過這樣的事情!不知道我在C++中對函數聲明的解釋嗎?

int operator() (const std::string& s1, const std::string& s2) const 

對我來說,運算符是一個const成員函數,它返回一個intger而且沒有可變參數! 但需要兩個const變量s1和s2?!?!我無法理解這一點!

class str_dist_ : 
public std::binary_function<std::string, std::string, int> { 
public: 
    int op() (const std::string& s1, const std::string& s2) const 
    { 
    if (s1 == s2) 
     return 0; 
    else if (s1.empty()) 
     return std::max(s2.size()/2, 1u); 
    else if (s2.empty()) 
     return std::max(s1.size()/2, 1u); 
    else 
     return min_edit_distance(s1, s2, zero_one_cost<char>(' ')); 
    } 
    std::string empty() const { return std::string(); } 
}; 

回答

3

operator()部分說str_dist_類型的對象可以被「調用」,就像它是一個函數一樣。 (const std::string& s1, const std::string& s2)告訴我們這個論據實際上是什麼。

例如,假設我們有一個對象str_dist_ obj;和兩個std::string對象,str1str2。然後,我們可以寫這樣的事情

int result = obj(str1, str2); 

在幕後,前行是相同的

int result = obj.operator()(str1, str2); 

注意,第一組括號是成員函數operator()的名稱的一部分,而第二組實際列出了參數。

如果您需要更多信息,請查找函子或函數對象。這些術語用來表示諸如str_dist_對象之類的東西,其中operator()爲它們定義。如果你使用這些條款中的任何一條,你一定會找到很多信息。

2

它的括號運營商(或 「函數調用操作符」):

Foo x; 
int n = x(12, 'a'); 
int m = x.operator()(12, 'a'); // equivalent 

在這裏,運營商被宣佈爲int Foo::operator()(int, char)

2

這是「函數調用操作」時,它允許使用「作爲功能」,即對象:

str_dist_ myObject; 
cout<<myObject("A string", "Another string"); // calls operator() 

前兩個括號表示,它的函數調用操作符(作爲+將表示它是+運算符等),然後跟隨參數列表。

重載函數調用操作符的全部要點是創建functors (function objects),即have several advantages超過普通函數。