函数作为函数参数

问题描述

我希望我的格式等没问题,因为这是我第一次发布问题。无论如何,我正在搜索并且找不到解释为什么两个不同的函数定义/声明彼此等效:

#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*周围的括号。最终与编译器完全相同。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...