Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ()的运算符重载及其可以使用的不同方式和条件_C++_Operator Overloading - Fatal编程技术网

C++ ()的运算符重载及其可以使用的不同方式和条件

C++ ()的运算符重载及其可以使用的不同方式和条件,c++,operator-overloading,C++,Operator Overloading,我想知道如何重载()运算符 比如说 class A{ int a,b; public: void operator()(int x, int y); }; void A::operator()(int x, int y){ x = a; y = b; } int main(){ A a = new A(); a(5,4); // this will call the overloaded operator return 0; } 我想

我想知道如何重载()运算符

比如说

class A{
    int a,b;
public:
    void operator()(int x, int y);
};

void A::operator()(int x, int y){
    x = a;
    y = b;
}

int main(){
    A a = new A();
    a(5,4); // this will call the overloaded operator
    return 0;
}
我想知道是否还有其他用例可以调用到下面的场景和其他场景中

操作符()
与任何其他函数一样。唯一的区别是,不是像调用
a.foo()
那样调用它,而是编写
a()

您可以像使用任何其他函数一样使用它,您可以任意重载它,它可以有任意多的参数(包括零),它可以被模板化,您可以想到任何其他函数都可以做的任何事情。

operator()
与任何其他函数一样。唯一的区别是,不是像调用
a.foo()
那样调用它,而是编写
a()

您可以像使用任何其他函数一样使用它,您可以随意重载它,它可以有任意多的参数(包括零),它可以被模板化,您可以想到任何其他函数都可以做的任何事情。

一般来说,operator()用于给出对象函数调用语义。如果您的对象可以被视为“正在做某事”,那么使用此操作符可能是有意义的。这些对象称为函子。它们通常用于封装一些将重复执行的操作,尤其是在许多对象上

有关有趣的示例和用法,请参见STL标题
算法
函数

顺便说一下,您正在分配一个A,但将其分配给一个对象而不是指针。当您分配A时,您正在调用
A::operator()
,您的编译器应该会抱怨。将
A A=newa()
更改为类似
A*A=newa或更简单的
Aa
不需要存在于main的执行之外。如果使用指针版本,则必须调用
操作符()
,如
(*a)(5,4)

此外,您的
A::operator()
也将无效。
x
y
参数按值传递。而是通过引用传递它们

在一般情况下,运算符()用于给出对象函数调用语义。如果您的对象可以被视为“正在做某事”,那么使用此操作符可能是有意义的。这些对象称为函子。它们通常用于封装一些将重复执行的操作,尤其是在许多对象上

有关有趣的示例和用法,请参见STL标题
算法
函数

顺便说一下,您正在分配一个A,但将其分配给一个对象而不是指针。当您分配A时,您正在调用
A::operator()
,您的编译器应该会抱怨。将
A A=newa()
更改为类似
A*A=newa或更简单的
Aa
不需要存在于main的执行之外。如果使用指针版本,则必须调用
操作符()
,如
(*a)(5,4)


此外,您的
A::operator()
也将无效。
x
y
参数按值传递。而是通过引用传递它们

一般来说,您是在询问
操作符()
的用例(这是一个相当广泛的问题),还是在询问您上面给出的操作符的具体实现,即使用参数作为输入来设置数据成员的操作符?当您说以下内容时,您指的是上面的内容,对吗?重载运算符也可以用
a.operator()(5,4)
调用,如果这是您要问的……实际上,我刚刚意识到,您的运算符甚至不设置数据成员。它将局部变量
x
y
设置为其数据成员的值。那一点用处都没有。如果您将参数作为引用
operator()(int&x,int&y)
,它可能会变得非常有用。有关函子的无数优点(即重载
operator()
的类)的一般信息,请参阅现有的问题:。您一般都在询问
operator()
的用例吗(那是一个相当宽泛的问题……),或者您是在询问您上面给出的运算符的具体实现,即使用参数作为输入来设置数据成员的运算符?当您说以下内容时,您是指上面的内容,对吗?重载运算符也可以用
a.operator()调用(5,4)
,如果这就是你要问的……事实上,我刚刚意识到,你的操作符甚至没有设置数据成员。它将局部变量
x
y
设置为其数据成员的值。这一点都不是很有用。如果你将参数作为引用
operator()(int&x,int&y)
。有关函子的无数优点(即重载
运算符()的类)的一般信息,请参阅现有问题:。