c++ 中的仿函数有状态而其他常规函数没有状态究竟意味着什么?

What exactly it means that functor in c++ have a state and other regular function doesnt have a state?

我是 C++ 中的 STL 概念的新手,当我通过一个仿函数时,我有一个结构,此时仿函数有一个状态,而其他常规函数没有状态。它究竟是什么意思?

到目前为止,我看到信息说仿函数有状态,因此它可以访问和存储其 class 的数据,其中 operator() 被重载,而其他常规函数只能访问传递给它的参数,因为它没有状态。

但是看看我下面的代码:

class MyFuncPtr
{
public:
    int a;

    int operator ()(int b)
    {
        return a + b;
    }
    
    MyFuncPtr(int val)
    {
        a = val;
    }
    
    int sum(int b)
    {
        return a + b;
    }
};

int main()
{
    cout << "Hello World!\n";

    MyFuncPtr obj(5);

    int c = obj(15);

    int d = obj.sum(15);
}

这里既有仿函数又有普通函数,我可以做同样的事情,那么具有“状态”的仿函数到底是什么意思?

单词functor指的是整个classMyFuncPtr,不只是operator()里面的

普通函数没有状态的意思是 free 函数不能在函数调用之间保留状态,而不是成员函数不能。

然而,这并不完全正确,因为普通函数可以有静态局部变量,这些变量确实保留了函数局部范围内的一些全局状态,并且它们也可以访问全局变量而无需将它们作为参数传递,这可以用作状态范围在函数本身之外。

状态也可以由任何函数通过与调用者的合同来维护,以通过函数的 return 值或输出参数将状态作为输入参数传递回它。

此外,仿函数 可以 有状态,但它们不需要。

“状态”指的是在后续调用函数或class方法之间记住和携带的数据。

你的 MyFuncPtr 是有状态的,因为它带有一个数据成员 a,其值在 MyFuncPtr 的构造函数中设置,并在对 [=14] 的所有调用中被记住和使用=].您设置一次状态,然后一遍又一遍地使用它。您可以轻松地更新状态,方法是让 MyFuncPtr::operator() 将新值保存到 a 中,然后公开另一个 class 方法以在需要时检索 a 的当前值.

在您的示例中,sum() 也是有状态的,因为它不是自由函数,它实际上是 MyFuncPtr 的非静态成员,因此可以访问相同的状态数据MyFuncPtr::operator() 有权访问的 (MyFuncPtr::a)。一个更好的无状态 sum() 示例看起来更像这样:

class MyFuncPtr
{
public:
    int a;

    int operator ()(int b)
    {
        return a + b;
    }
    
    MyFuncPtr(int val)
    {
        a = val;
    }
};

int sum(int a, int b)
{
    return a + b;
}

int main()
{
    cout << "Hello World!\n";

    MyFuncPtr obj(5);
    cout << obj(15) << endl;

    cout << sum(5, 15) << endl;
}