Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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,function-pointers,C++,C,Function Pointers,我最近很高兴使用函数指针。我开始了解它们是如何工作的。函数指针的经典示例是: int add() { return (100+10); } int sub() { return (100-10); } void print(int x, int y, int (*func)()) { printf("value is : %d", (x+y+(*func)())); } int main() { int x=100, y=200; print(x,y,add); pr

我最近很高兴使用函数指针。我开始了解它们是如何工作的。函数指针的经典示例是:

int add() {
  return (100+10);
}
int sub() {
  return (100-10);
}

void print(int x, int y, int (*func)()) {
  printf("value is : %d", (x+y+(*func)()));
}

int main() {
  int x=100, y=200;
  print(x,y,add);
  print(x,y,sub);
}
前几天有人问我,怎么会比打电话给Inside main更好:

print(add(x,y));
print(sub(x,y));

我很难解释这一点。它仅仅是关于堆栈的,还是下面还有其他东西?

我真的不明白为什么您展示的代码会是函数指针的经典示例。函数指针的实用性从以下代码中可以明显看出:

void transform(int *dst, const int *src, size_t len, int (*f)(int))
{
  for (size_t i = 0; i < len; ++i)
    dst[i] = f(src[i]);
}

基本上,如果您接受函数指针作为参数,它允许您对所选数据应用客户端提供的操作。

概括的经典用例是qsort。排序算法是通用的,但实现不知道如何比较项,因为它们可以是任何类型。所以您传入一个函数,它可以调用该函数来比较两个元素。

指向函数的指针是一个对象。因此,它可以像任何其他对象一样进行复制、存储和分配。 其中,作为对函数的引用,普通函数不是对象


我认为经典的例子是。。。。通过使用回调函数来处理用户界面事件,这已成为任何UI软件的一种明显模式。

如果您硬编码调用其中一个,函数指针的开销几乎是无用的,如您的示例所示。它们的力量来自于能够动态地选择和使用它们,或者将它们传递给其他功能:

您可以将函数指针放入数组中,并在其上循环;或者,您可以根据用户输入或输入文件内容或其他情况调用选定的。在这两种情况下,它们都允许编写具有单个动态调用的代码,而不是潜在的长开关或if语句链


第二个更有用的概念是将它们传递给其他函数,有时也称为“回调”;一个典型的例子是使用数据表和以函数指针形式的自定义比较函数调用qsort。qsort随后将在标准化排序算法中使用比较函数;没有其他方法可以实现这一点。

使用函数指针数组并在循环中调用它们如何?拥有一个泛型接口,将泛型类型和操作作为函数指针传递,怎么样?经典的例子是q排序。一方面,因为Adx、y和Sux、y是可编译的,但在C中是没有价值的,并且在C++中根本不编译,并且选择一种语言。因此,最直接的答案可能是因为代码无法编译。您的示例不够复杂,不足以显示使用函数指针的真正优势。考虑一些例子,其中指向函数必须在执行另一个函数的特定点调用,或者在一个以上的时间内调用,或者调用函数调用的参数。当您可以在没有函数指针的情况下执行它,并且不使代码复杂化时,不要使用函数指针。在某个时刻,你会看到他们的需要;与printx,y,addx,y相比;与printaddx,y进行更好的比较;缺少使用x,y.Aahaa的权限。这就是我要找的。凉的它不应该是p[i]=fp[i],因为它接受一个参数。@HemantBhargava注意到fp[i]已经在p[i]上的某个对象上被调用了。顺便说一句,我修改了这个示例,以避免与赋值表达式两侧出现的p混淆。