1.函数类型
函数也是一个对象,因此它也有自己的类型。如下面代码所示:
int fun1(int x); //函数类型为:int(int)
int fun2(double x,int y); //函数类型为:int(double,int)
void fun3(); //函数类型为:void()
2.声明函数指针与赋值、调用
函数指针的声明与数组指针的声明很类似。如下面代码所示:
include <iostream>
int fun1(int x)
{
return x +1;
}
int main()
{
//,声明一个函数指针funPtr1,让它指向形参为int,返回值为int的函数。
int (*funPtr1)(int); //函数指针声明
funPtr1 = fun1 ; //函数指针的赋值
funPtr1(100); //函数指针的调用
return 0;
}
3. 函数指针做函数参数
#include <iostream>
//使用using声明一个int(int)类型的函数指针。(using和typedef相同)
using funPtr = int(*)(int);
int fun1(int x)
{
return x + 1;
}
//函数指针作为fun2的参数
int fun2(funPtr f)
{
return f(100);
}
int main()
{
//传入fun1
std::cout << fun2(fun1) << std::endl; //打印101
return 0;
}
4.函数指针作为函数返回值
#include <iostream>
//使用using声明一个int(int)类型的函数指针。(using和typedef相同)
using funPtr = int(*)(int);
int fun1(int x)
{
return x + 1;
}
int fun2(int x)
{
return x - 1;
}
//函数指针作为fun2的返回值
funPtr fun3(bool b)
{
if(b)
return fun1;
else
return fun2;
}
int main()
{
//传入fun1
std::cout << (fun3(true))(100) << std::endl; //打印101
return 0;
}
上面代码中,fun1、fun2都是接受一个int,然后返回int。fun3接受一个bool值,然后返回一个int(*)(int)的函数指针。main函数中给fun3传入true,所以fun3会返回指向fun1的指针,最后给指向fun1的指针传入100。根据fun1的逻辑会打印101。
5.函数指针与函数重载
当函数指针作为函数返回值时或初始化时可以不用显示的声明某一具体类型的函数指针。比如上面4代码所示,fun3显示的返回funPtr(using funPtr = int(*)(int))类型的函数指针。也可以使用auto进行类型推导:
#include <iostream>
//使用using声明一个int(int)类型的函数指针。(using和typedef相同)
//using funPtr = int(*)(int);
int fun1(int x)
{
return x + 1;
}
//函数指针作为fun2的返回值
//使用auto进行类型推导
auto fun3()
{
return fun1;
}
int main()
{
//传入fun1
std::cout << (fun3())(100) << std::endl; //打印101
return 0;
}
上面代码中使用auto进行返回值的类型推导,之所以能对fun3的返回值进行类型推导是因为fun3的返回值fun1没有发生重载,fun1只有唯一的类型int(int)。但是当存在函数重载时,就不能使用auto进行类型推导了。下面举例说明,说明之前先介绍函数重载。
函数重载:可以定义多个函数名相同的函数,每个函数具有不同的形参列表。不同的形参列表具体是指形参个数不一样或者形参的类型不一样。不能基于不同的返回值进行函数重载。
进入正题,接下来说明当存在函数重载时,就不能使用auto进行类型推导。
#include <iostream>
//使用using声明一个int(int)类型的函数指针。(using和typedef相同)
//using funPtr = int(*)(int);
int fun1(int x)
{
return x + 1;
}
int fun1(double x)
{
return x - 1;
}
//函数指针作为fun2的返回值
//使用auto进行类型推导
auto fun3()
{
return fun1; //报错
}
int main()
{
//传入fun1
std::cout << (fun3())(100) << std::endl; //打印101
return 0;
}
上面的代码会报错,因为此处进行auto推导是无法确定返回的指针是int()(int)还是int()(double)。此时只能显示的返回int()(int)或int()(double)。可以使用using进行函数指类型的声明。