例如,考虑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 ++中的许多程序都使用->*
语法,我没有发现这是奇怪或奇怪的;我不明白关于代表的这种潜力以及对指针的攻击。</ p>
答案 0 :(得分:4)
成员指针和true闭包之间的区别在于闭包包含函数和关联状态。这两者是不可分割的。
成员指针只是该函数。要调用成员指针,您必须提供状态。
这是函数指针和仿函数之间的区别。函数对象保存要调用的函数(作为operator()
的重载),但也可以有成员。这些成员可以是私有的,从而提供封装。函数对象是C ++规则的对象,因此它具有显式生存期。它是根据C ++规则构造和销毁的。
函数指针没有生命周期;它总是存在(除非它是NULL)。它没有封装的状态。
因此,它不是一个闭包,因为它不能关闭任何东西。
这就是为什么C ++ 11 lambdas被实现为显式对象的原因。这样,他们可以关闭事物。他们有封装状态。
答案 1 :(得分:3)
我认为人们发现编写它们很困难,但它们的行为与普通指针相同,如果它们为NULL则执行它们是错误的。如果它们被正确编写和使用,那么它们没有任何问题。我从来没有真正遇到过问题,可能除了忘记正确的语法之外。
在c ++ 11中,您可以使用std :: function&lt;&gt; class是函数指针的包装器。您可以将它用于函数,成员函数,函数对象和lambdas。
例如:
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
答案 2 :(得分:0)
成员函数指针不是成员函数。 C / C ++中的函数指针是危险的,因为它们可以指向释放的内存或者在任何时候都设置为NULL。通常它们是可以避免的,但并不总是使用boost :: bind或交换打印函数。
因此,一般来说它们并不比标准指针更危险。但是,您通常可以通过仅调用对象的成员方法或静态函数来避免使用函数指针。它编译为在内部使用函数指针,但是当它被调用时你可以更好地保证该函数的存在。