这个C++结构体的含义是什么?

问题描述:

我有一个简单的C++结构如下:这个C++结构体的含义是什么?

// Functor for peak to decreasing intensity sorting 
struct cmp_decr_int2 
{ 
    bool operator() (peak2 a, peak2 b) 
    { 
     return a.int2 > b.int2; 
    } 
}; 

是有操作者的该样品中的过载?

+0

对不起,我对此表示歉意 – ladyfafa 2010-08-13 02:55:46

+0

感谢编辑:) – ladyfafa 2010-08-13 02:56:03

+2

请注意,在C++中,'struct'只是一个'class',默认的辅助功能是'public'。这个问题不是特定于'struct',也不是答案。 – 2010-08-13 08:03:28

C++中的结构只是具有public而不是private的默认访问器的类。所以是的,那会有一个功能超载。

是的。 operator()被称为“函数调用”操作符,并允许对象可用,就像它是一个函数一样。这样的班级被称为“功能员”。

一个常见模式是使函子比较两个事物的等式或关系,用于需要比较谓词的任何事物。 (这一个可能是可用在std::map,例如这将有一个构件等cmp_decr_int2 compare;然后它可以在两个事物之间具有比较的关系:if (compare(x, y)) /* x is less than y, by some metric */

通过比较它们int2这种特殊的结构顺序2 peak2的成员。它可以更好地写为:

struct cmp_decr_int2 
{ 
    //      note const! vvvvv 
    bool operator() (peak2 a, peak2 b) const 
    { 
     return a.int2 > b.int2; 
    } 
}; 

的功能应该是const,因为它不需要更改任何成员(有没有改变。)const-correctness重要*

在许多情况下,这些仿函数。在参数本身为const的上下文中使用,所以您应该按照示例中的值或通过常量引用采用参数。

除了当该类型是基本类型(float,unsigned int,double等)或小于void*时,您应该更喜欢通过const-reference传值类型。在大多数情况下,那么,您将通过常量引用:

struct cmp_decr_int2 
{ 
    // note const&: vvvvv  v vvvvv  v vvvvv 
    bool operator() (const peak2 & a, const peak2 & b) const 
    { 
     return a.int2 > b.int2; 
    } 
}; 

*如果这是在std::map用作谓语,例如,没有const地图将无法比较两个而在const函数中。

+0

@GMan:谢谢 – ladyfafa 2010-08-13 03:06:25

+0

@Gman:+1,很好的回答。 – 2010-08-13 03:54:26

+1

如果peak2对象不是很小,参数也应该是const引用。 – 2010-08-13 08:01:51

C++中的结构是在这样一类各种方式,除了默认的参数访问public:而非private:。当定义类型的使用范围非常狭窄时,比如在一个简单函子的例子中,使用struct而不是class是一种常见的做法。

这个例子所做的是模拟一个函数指针的外观,而没有可能为空的脆弱性。

operator()这里的成员重载函数调用。当您尝试执行如下操作时:

cmp_decr_int2 foo; 
foo(peek2(), peek2()); 

重载成员被调用。

+0

这对初学者来说非常详细,真的有帮助! :) – ladyfafa 2010-08-13 03:06:07

#include <iostream> 
using namespace std; 

struct cmp_decr_int2 
{ 
    bool operator() (int a, int b) 
    { 
     return a > b; 
    } 

    bool operator() (int i) 
    { 
     return i > 0; 
    } 
}; 

int main() 
{ 
    cmp_decr_int2 a; 
    cout << a(1, 2) << endl; 
    cout << a(1) << endl; 
} 

是的,肯定可以超载的功能!这对我来说非常合适。

+0

@BT:谢谢!~~~ – ladyfafa 2010-08-13 03:09:58

$ 13.5。4个状态 -

operator()应该是一个具有任意数量参数的非静态成员函数。它可以有默认参数。它实现函数调用语法postfix-expression(expression-listopt),其中后缀表达式计算为一个类对象,可能的空表达式列表匹配该类的operator()成员函数的参数列表。因此,如果存在T :: operator()(T1,T2,T3),则对于类型为T的类对象x,将调用x(arg1,...)解释为x.operator()(arg1,...)并且如果运算符被重载解析机制(13.3.3)选为最佳匹配函数。

因此,struct'cmp_decr_int2'肯定重载了operator()。

请注意,这也是C++中唯一可以携带可变数量参数的运算符。