没有符号的运算符和两组参数意味着什么?

时间:2013-02-26 17:14:51

标签: c++ operator-overloading

Here我看到了一些运算符重载的明显例子。语法如下:

type operator sign (parameters) { /*...*/ }

在我处理的代码中,我找到了以下字符串:

bool operator () (int a)

我对此代码的第一个问题是没有操作符(不像operator+operator*)。第二个问题是在论证(int a)前面我看到()而我无法找出它应该做什么。你可以帮帮我吗?

3 个答案:

答案 0 :(得分:7)

你没有关于没有操作符号的错误。运算符是()运算符。请注意,有两组括号。第一个集合是函数名称operator ()的一部分,第二个集合是该运算符的参数。

每当您使用定义它的对象时,就会调用operator ()重载,就好像它是一个函数一样。考虑:

struct greater_than_five
{
  bool operator()(int x) const { return x > 5; }
};

此类已重载operator (),因此当您向其传递大于5的整数时,它将返回true。您可以像这样使用它:

greater_than_five f;
if (f(10)) {
  // 10 is greater than 5
}

请注意,尽管f不是函数且属于greater_than_five类型的对象,但我们可以将其称为,就像函数一样f(10)。这是一个愚蠢的例子,但演示了这些类的使用。这些类通常称为仿函数函数对象

答案 1 :(得分:4)

这意味着可以使用类似函数的语法调用具有该运算符的类的实例。此类可以称为仿函数

struct Foo
{
  bool operator () (int a) { std::cout << "Foo " << a << "!\n"; }
};

然后

Foo f;
f(42); // prints "Foo 42!"

operator()部分表示可以使用()调用运算符,接下来是参数列表,类似于普通函数。

答案 2 :(得分:1)

运算符“()”是括号运算符。您可以重载它以获取任何类型和任意数量的参数。这是一个例子:

class Vector3
{
public:
Vector3(float x, float y, float z)
{
    _data[0] = x;
    _data[1] = y;
    _data[2] = z;
}

float& operator() (const int component)
{
    assert(component >= 0 && component < 3);
    return _data[component];
}

private:
    float _data[3];
};

用法:

Vector3 vec(3.0, 1.0, 2.0);
vec(2) = 0.5;
cout<<"Third component : "<<vec(2);

打印0.5