问题描述
我希望我的格式等没问题,因为这是我第一次发布问题。无论如何,我正在搜索并且找不到解释为什么两个不同的函数定义/声明彼此等效:
#include <iostream>
using namespace std;
int quadrat( int x )
{
return x*x;
}
void printTable_1( int start,int end,int step,int (*func)( int x ) )
{
for ( int i = start; i <= end; i+=step )
{
cout << i << "\t" << func(i) << '\n';
}
}
void printTable_2( int start,int func( int x ) )
{
for ( int i = start; i <= end; i+=step )
{
cout << i << "\t" << func(i) << '\n';
}
}
int main()
{
printTable_1(1,10,1,quadrat);
printTable_2(1,quadrat);
return 0;
}
我不明白的是,我没有在函数“ printTable_2”中明确定义一个函数指针,就像在函数“ printTable_1”中那样,它仍然期望一个。预先感谢您的回答!
解决方法
这两个定义与编译器相同。在第Effective STL页的第20页或PDF第26页中可以找到有关此行为的粗略概述。
现在让我们看看另外三个函数声明。第一个 声明一个函数g,它接受一个指向a的指针的参数 函数不执行任何操作并返回双精度值:
int g(double (*pf)());
这是说同一句话的另一种方式。唯一的区别是 pf是使用非指针语法声明的(两种语法均有效) C和C ++):
int g(double pf()); // same as above; pf is> implicitly a pointer
通常,可以省略参数名称,因此 这是g的第三个声明,其中pf是 淘汰:
int g(double ()); // same as above; parameter name is omitted
所以在您的示例中,我们有
int (*func)( int x )
和
int func( int x )
如您所见,它与示例中的方法相同,在该示例中,我们仅省略了func
和*
周围的括号。最终与编译器完全相同。