在这里,我看到了一些运算符重载的清晰示例。语法如下:
type operator sign (parameters) { /*...*/ }
在我处理的代码中,我发现了以下字符串:
bool operator () (int a)
我对这段代码的第一个问题是没有运算符符号(没有类似operator+
or operator*
)。第二个问题是,在(int a)
我看到的论点面前,()
我不知道它应该做什么。你能帮我解决这个问题吗?
在这里,我看到了一些运算符重载的清晰示例。语法如下:
type operator sign (parameters) { /*...*/ }
在我处理的代码中,我发现了以下字符串:
bool operator () (int a)
我对这段代码的第一个问题是没有运算符符号(没有类似operator+
or operator*
)。第二个问题是,在(int a)
我看到的论点面前,()
我不知道它应该做什么。你能帮我解决这个问题吗?
关于没有操作符符号,您是不正确的。运营商就是()
运营商。请注意,有两组括号。第一组是函数名的一部分,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)
,使用. 这是一个愚蠢的例子,但演示了这些类的使用。这些类通常称为函子或函数对象。
这意味着可以使用类似于函数的语法调用具有该运算符的类的实例。这个类可以称为函子:
struct Foo
{
bool operator () (int a) { std::cout << "Foo " << a << "!\n"; }
};
然后
Foo f;
f(42); // prints "Foo 42!"
operator()
部分表示可以使用 调用操作符,()
后面是参数列表,类似于普通函数。
运算符“()”是括号运算符。您可以重载它以采用任何类型和任意数量的参数。这是一个例子:
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