我不确定我在C ++中对函数声明的解释?

时间:2011-09-28 23:57:27

标签: c++ const

这似乎是一个愚蠢的问题,但我从未见过这样的事情!

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

to me operator是一个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 个答案:

答案 0 :(得分: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()的名称的一部分,而第二组实际上列出了参数。

如果您想了解更多信息,请查看Functors或Function Objects。这些是用于引用诸如str_dist_个对象之类的术语,这些对象具有为其定义的operator()。如果你谷歌中的任何一个术语,你肯定会找到很多信息。

答案 1 :(得分:2)

它是括号运算符(或“函数调用运算符”):

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

此处运算符声明为int Foo::operator()(int, char)

答案 2 :(得分:2)

它是“函数调用运算符”,它允许对象“作为函数”使用,即:

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

前两个括号表示它是函数调用运算符(因为+表示它是+运算符等),然后是参数列表。

重载函数调用运算符的重点是创建functors (function objects)have several advantages超过普通函数。