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;
}
我是 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;
}