这个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;
}
};
是有操作者的该样品中的过载?
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
函数中。
@GMan:谢谢 – ladyfafa 2010-08-13 03:06:25
@Gman:+1,很好的回答。 – 2010-08-13 03:54:26
如果peak2对象不是很小,参数也应该是const引用。 – 2010-08-13 08:01:51
C++中的结构是在这样一类各种方式,除了默认的参数访问public:
而非private:
。当定义类型的使用范围非常狭窄时,比如在一个简单函子的例子中,使用struct而不是class是一种常见的做法。
这个例子所做的是模拟一个函数指针的外观,而没有可能为空的脆弱性。
operator()
这里的成员重载函数调用。当您尝试执行如下操作时:
cmp_decr_int2 foo;
foo(peek2(), peek2());
重载成员被调用。
这对初学者来说非常详细,真的有帮助! :) – 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;
}
是的,肯定可以超载的功能!这对我来说非常合适。
@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++中唯一可以携带可变数量参数的运算符。
对不起,我对此表示歉意 – ladyfafa 2010-08-13 02:55:46
感谢编辑:) – ladyfafa 2010-08-13 02:56:03
请注意,在C++中,'struct'只是一个'class',默认的辅助功能是'public'。这个问题不是特定于'struct',也不是答案。 – 2010-08-13 08:03:28