给定打印功能:
void print(int i)
{
cout << i << endl;
}
为什么我们允许在主要功能中执行此操作:
void (*bar)(int);
bar = &print;
但不是这样:
void fizz(int);
fizz = print;
但是当谈到函数参数时,我们可以将指针传递给函数或函数的副本:
void foo(void (*f)(int))
{
(*f)(1);
}
void test(void f(int))
{
f(1);
}
有人知道这些差异的原因吗?
答案 0 :(得分:0)
函数指针可以指向具有相同参数和返回类型的任何函数。在上面的代码中,&#34; bar&#34;是指针,bar=&print
表示让bar
指向print
。但是,函数不能=
一个函数。
对函数指针有用的是,只要函数具有相同的参数和返回类型,它就可以指向ANY函数。当函数指针用作另一个函数的参数时,这证明非常有用。
当函数用作参数时,传递的真实函数是函数的ADDRESS。函数不能被解除引用(即它不能作为函数传递)。我不是很清楚,但似乎foo
和test
的实现是相同的。
答案 1 :(得分:0)
我建议从c ++ 11中读取std :: function: http://en.cppreference.com/w/cpp/utility/functional/function
这将允许您执行更多您想要的操作,其中void(int)指的是函数的返回类型和参数列表:
void fizz( std::function<void(int)> f )
{
f(1);
}
函数现在是一流的数据类型。您甚至可以在没有任何痛苦语法的情况下使用函数进行类方法。在许多情况下,您还可以使用auto进行延迟/动态替换。此外,您可以使用相同的设置来执行有趣的操作,例如异步启动函数。
auto used_to_call_fizz = fizz;
used_to_call_fizz( f );
std::async( used_to_call_fizz, f );
答案 2 :(得分:0)
每个函数都有自己的地址,您可以将其视为array
。函数void fizz(int)
和void print(int i)
具有不同的内存地址,因此fizz = print;
会出错。但是你使用void (*bar)(int);
,它显示了一个函数指针,用于指向一个函数。当您使用bar=&print
时,它将初始化bar
指针,然后获得正确答案。顺便说一下,您可以使用bar=print
,因为它们具有与array
相同的内存地址。我希望这可以帮到你。