Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中的“函数指针”与C中的“委托”行为类似吗?_C++_Function Pointers - Fatal编程技术网

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语言。这里对委托类的引用:-我想它只是方法和目标以及一些内部链接列表,但对我来说,它似乎更像是从这些属性中提取运行时类型信息的能力。