()
运算符。在C++中将函数作为对象使用是否会带来便利?
为什么我们不能只使用函数指针?有例子吗?
()
运算符。当然,我们可以始终使用函数指针而不是函数对象,但是函数对象提供了某些优点,例如:
更好的性能:
最显著且重要的优点之一是它们更可能提供更好的性能。在函数对象的情况下,编译器可以准确地确定并内联要调用的函数,因为编译时有更多的细节可用,而在函数指针的情况下,解引用指针使得编译器难以确定实际调用的函数。
函数对象是智能函数:
函数对象可以具有其他成员函数和属性,这意味着函数对象具有状态。实际上,由函数对象表示的相同函数在同一时间可能具有不同的状态。这对于普通函数是不可能的。函数对象的另一个优点是您可以在运行时初始化它们,然后再使用/调用它们。
只有当函数签名不同时,普通函数才能具有不同的类型。但是,即使其签名相同,函数对象也可以具有不同的类型。实际上,由函数对象定义的每个函数行为都具有其自己的类型。这对于使用模板进行泛型编程是一个重要的改进,因为可以将函数行为作为模板参数传递。
operator ()
,编译器很容易就可以内联代码并节省额外的调用,这样会增加性能。operator ()
的好处是,可以设计一个隐式地将函数对象作为参数考虑进去的函数,无需将其作为单独的函数传递。手工编码越少,程序中的错误越少,可读性也更强。operator ()
进行函数式编程。> 在C++中将函数用作对象是否有任何便利之处?
是的:C++模板机制允许所有其他C/C++编程风格(C风格和OOP风格,见下文)。
> 为什么我们不能只使用函数指针?有例子吗?
但我们可以:一个简单的C函数指针也是一个具有良好定义的operator()的对象。 如果我们设计一个库,我们不想强迫任何人使用那种不需要的C指针样式。这通常像强制一切/每个人都在/使用OOP风格一样不受欢迎;见下文。
从C程序员和函数式程序员的视角来看,OOP不仅倾向于更慢,而且更啰嗦,在大多数情况下也是错误的抽象方向("信息"不应该是一个"对象")。由于这个原因,每当在其他上下文中使用"对象"这个词时,人们往往会感到困惑。
在C++中,任何具有所需属性的东西都可以被视为一个对象。在这种情况下,一个简单的C函数指针也是一个对象。这并不意味着在不需要时使用OOP范例;这只是使用模板机制的正确方式。
为了理解性能差异,比较编程(语言)风格/范例及其可能的优化:
C风格:
C++(和Java)OOP风格:
C++模板风格:
C++模板非常灵活,可以允许上述其他两种风格,并且在内联的情况下,它们甚至可以胜过...
编译的函数式语言:(排除JVM和Javascript作为目标平台,因为缺少"proper tail calls")