3

例如,考虑 C#

与 C 或 C++ 中的函数指针不同,委托是面向对象的、类型安全的和安全的。

来源:http: //msdn.microsoft.com/en-us/library/aa288459%28v=vs.71%29.aspx

现在只讨论 C++,真正的区别是什么,OO 前景中缺少什么?

也来自另一个来源

大多数 C++ 程序员从未使用过成员函数指针,这是有充分理由的。它们有自己奇怪的语法(例如 ->* 和 .* 运算符),很难找到关于它们的准确信息,而且你可以用它们做的大部分事情都可以通过其他方式做得更好。这有点可耻:编译器编写者实现适当的委托实际上比实现成员函数指针更容易!

来源: http: //www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

我发现很多 C++ 程序都使用这种->*语法,我不觉得这很奇怪或奇怪;关于代表的这种潜力和对指针的攻击,我不明白这一点。

4

3 回答 3

4

成员指针和真正的闭包之间的区别在于闭包包含函数关联的状态。两者密不可分。

成员指针只是函数。为了调用成员指针,您必须提供状态。

这是函数指针和函子之间的区别。函数对象保存要调用的函数(作为 的重载operator()),但它也可以有成员。这些成员可以是私有的,从而提供封装。函数对象是 C++ 规则的对象,因此它具有明确的生命周期。它是根据 C++ 规则构造和销毁的。

函数指针没有生命周期;它始终存在(除非它为 NULL)。它没有要封装的状态。

因此,它不是一个闭包,因为它不能关闭任何东西。

That's why C++11 lambdas are implemented as explicit objects. That way, they can close over things. They have encapsulated state.

于 2012-08-10T20:15:36.867 回答
3

我认为人们很难编写它们,但它们的行为就像普通指针一样,如果它们为 NULL 则执行它们是错误的。如果它们被正确编写和使用,那么它们就没有错。我从来没有真正遇到过问题,也许除了忘记正确的语法。

在 c++11 中,您可以使用 std::function<> 类,它是函数指针的包装器。您可以将它用于函数、成员函数、函数对象和 lambda。

例如:

void foo(int x);
std::function<void(int)> f=foo;
f(1);

或更简单(在 VS2010 中工作):

void foo(int x);
std::function<decltype(foo)> f=foo;
f(1);

参考:http ://en.cppreference.com/w/cpp/utility/functional/function

于 2012-08-10T20:11:59.457 回答
0

成员函数指针不是成员函数。C/C++ 中的函数指针是危险的,因为它们可能指向已释放的内存或随时设置为 NULL。通常会避免使用它们,但并不总是使用诸如 boost::bind 或交换打印功能之类的东西。

因此,一般来说,它们并不比标准指针更危险。但是,您通常可以通过在其他地方调用对象的成员方法或静态函数来避免使用函数指针。它编译为在内部使用函数指针,但是当它被调用时,您可以更好地保证该函数的存在。

于 2012-08-10T19:46:59.917 回答