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

时间:2010-08-13 02:50:45

标签: c++ struct overloading

我有一个简单的C ++结构如下:

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

此示例中的运算符是否过载?

5 个答案:

答案 0 :(得分:10)

是。 operator()被称为“函数调用”运算符,并允许对象可用,就好像它是一个函数一样。这样的课程被称为“仿函数”。

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

这个特定的结构通过比较他们的peak2成员来命令两个int2。它可以更好地写成:

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

该函数应该是const,因为它不需要更改任何成员(没有更改。)const-correctness很重要。*

在许多情况下,这些仿函数用于参数本身为const的上下文中,因此您应该按照示例中的值或通过常量引用来获取参数。

您应该更喜欢通过const-reference over-value传递类型,除非该类型是基本类型(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函数内比较两件事。

答案 1 :(得分:0)

C ++中的结构只是具有public而非private的默认访问者的类。所以,是的,这会导致函数过载。

答案 2 :(得分:0)

在c ++中,除了默认参数访问是public:而不是private:之外,结构在各方面都像一个类。当定义类型的使用范围非常狭窄时,例如在简单仿函数的示例中,使用struct而不是类是常见的做法。

这个例子的作用是模拟函数指针的外观,而不会有可能为null的脆弱性。

此处operator()成员重载函数调用。当你尝试做类似的事情时:

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

调用重载成员。

答案 3 :(得分:0)

#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;
}

是的,确定可以超载功能!这对我很有用。

答案 4 :(得分:0)

$ 13.5.4州 -

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

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

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