C++中的“函数指针”与C中的“委托”行为类似吗?
我有一个小问题C++中的“函数指针”与C中的“委托”行为类似吗?,c++,function-pointers,C++,Function Pointers,我有一个小问题 C++中的函数指针与C?中的委托行为相似,P:>是的,它们是相似的。 但是C++中的函数指针不能指向类的实例方法,而C中的委托可以.是的,它们是相似的。 但是C++中的函数指针不能指向类的实例方法,而C中的委托可以是.< /p> ,是的,但是委托人更丰富。函数指针只是指向函数所在内存的指针。委托是将函数指针与其他信息包装在一起的类 因为基本上C中的所有内容都是一个类,所以委托可以指向类上的方法。在C++中,这是一个真正的痛苦,因为C++函数使用特殊的调用约定调用类方法,函数指针
C++中的函数指针与C?
中的委托行为相似,P:>是的,它们是相似的。但是C++中的函数指针不能指向类的实例方法,而C中的委托可以.
是的,它们是相似的。
<>但是C++中的函数指针不能指向类的实例方法,而C中的委托可以是.< /p> ,是的,但是委托人更丰富。函数指针只是指向函数所在内存的指针。委托是将函数指针与其他信息包装在一起的类 因为基本上C中的所有内容都是一个类,所以委托可以指向类上的方法。在C++中,这是一个真正的痛苦,因为C++函数使用特殊的调用约定调用类方法,函数指针本身不存储指向一个必须单独维护的对象的指针。
委托也可以链接在一起,并且比C++函数指针具有更多的类型灵活性。本质上看,是的,但代表们要富有得多。函数指针只是指向函数所在内存的指针。委托是将函数指针与其他信息包装在一起的类
因为基本上C中的所有内容都是一个类,所以委托可以指向类上的方法。在C++中,这是一个真正的痛苦,因为C++函数使用特殊的调用约定调用类方法,函数指针本身不存储指向一个必须单独维护的对象的指针。委托也可以链接在一起,并且比C++函数指针具有更多的类型灵活性。参见
是的,C的委托是一种处理函数指针的类类型。函数指针只是一个32位或64位无符号整数,它指向函数所在的内存中的特定位置。在C++中,你只需要一个原始的、非托管函数指针。 嗯,是的,C的委托是一个处理函数指针的类类型。函数指针只是一个32位或64位无符号整数,它指向函数所在的内存中的特定位置。在C++中,您只需有一个原始的、非托管函数指针。 .NET委托可以有状态——即您可以创建对象实例方法的委托,并将其保存在委托中:Foo f;
BarDelegate d = f.Bar;
d(); // stores f as 'this' pointer.
当函数指针指向非成员函数时,它们与委托具有相同的用法。有人可能会说,在这方面,他们实际上比代表们好,因为他们重量更轻,不需要分配
但是,函数指针没有状态。这使它们在与成员函数一起使用时大不相同-这需要在调用函数指针时传入:
Foo f;
BarPtr p = &Foo::Bar;
(f.*p)(); // need to pass in 'this' pointer. ugly call syntax!
在C++中,我们也有函子-对象,这些对象可以有状态,可以调用一个函数。在调用模板函数时,这是代理最常用的替代方法。但函子只是一个类型概念,而不是实际的类型:
struct BarFunctor
{
void operator()();
};
BarFunctor f;
f(); // not even a pointer, it's a full object and you're calling it.
对于.NET委托功能的精确复制,更恰当的比较可能是C++的std::function,它是一个可以用特定调用签名包装任何其他函子的函子。然而,std::function并没有被大量使用,因为与委托一样,它们也有一些开销,而且模板通常不需要这样一个重量级的对象:
Foo f;
std::function<void()> func = [&] { f.Bar(); }; // the lambda object (a
func(); // functor) capturing a
// reference to f is
// stored into func (also
// a functor).
.NET委托可以具有状态-即,您可以创建对象实例方法的委托,并将其保存在委托中:
Foo f;
BarDelegate d = f.Bar;
d(); // stores f as 'this' pointer.
当函数指针指向非成员函数时,它们与委托具有相同的用法。有人可能会说,在这方面,他们实际上比代表们好,因为他们重量更轻,不需要分配
但是,函数指针没有状态。这使它们在与成员函数一起使用时大不相同-这需要在调用函数指针时传入:
Foo f;
BarPtr p = &Foo::Bar;
(f.*p)(); // need to pass in 'this' pointer. ugly call syntax!
在C++中,我们也有函子-对象,这些对象可以有状态,可以调用一个函数。在调用模板函数时,这是代理最常用的替代方法。但函子只是一个类型概念,而不是实际的类型:
struct BarFunctor
{
void operator()();
};
BarFunctor f;
f(); // not even a pointer, it's a full object and you're calling it.
对于.NET委托功能的精确复制,更恰当的比较可能是C++的std::function,它是一个可以用特定调用签名包装任何其他函子的函子。然而,std::function并没有被大量使用,因为与委托一样,它们也有一些开销,而且模板通常不需要这样一个重量级的对象:
Foo f;
std::function<void()> func = [&] { f.Bar(); }; // the lambda object (a
func(); // functor) capturing a
// reference to f is
// stored into func (also
// a functor).
你在研究中遇到了哪些相似之处和不同点?从委托人看就像C++函数指针,但类型安全。@ JonathonReinhart,你知道函数指针不安全的确切含义吗?也许我的大脑不是完全的,但我看不到它们指的是什么。”克里斯:我仍然学习C++,当我看到函数指针时,我记得C中的知识,尤其是代表。
“泰。”克里斯,我也从来没有完全理解他们的意思。很多时候我都依赖C函数指针的静态类型安全性。与任何其他函数一样,参数类型必须匹配,即使将函数指针作为参数传递,整个签名也必须匹配。使用typedef!你在研究中遇到了哪些相似之处和不同点?从委托人看就像C++函数指针,但类型安全。@ JonathonReinhart,你知道函数指针不安全的确切含义吗?也许我的大脑不是完全的,但我看不到他们指的是什么。”克里斯:我仍然学习C++,当我看到函数指针时,我记得我在C中特别知道的是什么。克里斯,我从来没有完全理解他们的意思。很多时候我都依赖C函数指针的静态类型安全性。与任何其他函数一样,参数类型必须匹配,即使将函数指针作为参数传递,整个签名也必须匹配。使用typedef!学究般地说,函数指针不能,但成员函数指针可以。@JonathonReinhart:好吧,成员函数指针与非成员函数指针具有不同的签名。公平地说,我撤销了我的否决票。但是由于C++中的名称不同,所以我觉得这是不恰当的,因为C++的能力与C++相比。但是成员函数指针可以。@JonathonReinhart:嗯,成员函数指针与非成员函数指针具有不同的签名。公平地说,我撤销了我的否决票。但是由于C++中的名称不同,所以我觉得这是不恰当的,因为C语言与C++的能力比较,J.JONATON ReNHART,这是我的思路。为了参考,只想添加这个伟大的参考:这是它包裹的其他信息吗?例如,我假设引用包含的对象。啊,对不起。。。是的,我没有C语言。这里对委托类的引用:-我想它只是方法和目标以及一些内部链接列表,但对我来说,它似乎更像是从这些属性中提取运行时类型信息的能力。它包含的其他信息是什么?例如,我假设引用包含的对象。啊,对不起。。。是的,我没有C语言。这里对委托类的引用:-我想它只是方法和目标以及一些内部链接列表,但对我来说,它似乎更像是从这些属性中提取运行时类型信息的能力。