博客总结 :
- 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;
- 判定标准 : 只有 函数参数 的 个数 / 类型 / 顺序 的不同 是 " 函数重载 " 的判断标准 , 函数 的 返回值 不是 " 函数重载 " 的 判断标准 ;
- 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ;
- 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型 , 自动匹配 重载函数 ;
一、函数指针定义方法
先定义一个函数 , 在本章节中使用不同的方法 , 定义该函数 对应 的 函数指针 ;
// 定义一个函数
int add(int a, int b) {
return a + b;
}
1、直接定义函数指针
按照下面的 函数指针 语法 , 定义函数指针 ;
" 函数指针 " 定义语法 :
return_type (*func_ptr)(parameter_list);
- return_type : 函数指针 指向的函数 的 返回值类型 ;
- func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ;
- parameter_list : 函数指针 指向函数 的 参数列表 ;
直接使用 函数指针 定义语法 , 定义 函数指针 ;
// 直接定义 函数指针
int (*func3)(int a, int b) = add;
2、通过 函数类型 定义 函数指针
首先 , 使用 typedef 关键字 , 定义 函数类型 , 下面的代码 定义了 函数类型 func , 函数的 参数列表是 2 个 int 参数 , 返回值是 int ;
// 定义函数类型 func , 参数列表是 2 个 int 参数 , 返回值是 int
typedef int (func)(int a, int b);
然后 , 通过定义的 func 函数类型 , 定义函数指针 , 直接根据指针的定义语法 指针类型* 指针名称
定义函数指针 , 同时将 add 函数 的 地址 赋值给 函数指针 ;
// 根据 函数类型 定义 函数指针
func* func1 = add;
3、通过 函数指针类型 定义 函数指针
首先 , 通过 typedef 关键字, 定义 函数指针 类型 , 类型名称为 func_ptr , 对应的函数的 参数列表是 2 个 int 参数 , 返回值是 int ;
// 定义函数指针类型 func_ptr , 参数列表是 2 个 int 参数 , 返回值是 int
typedef int (*func_ptr)(int a, int b);
然后 , 通过 func_ptr 函数指针类型 , 定义 函数指针 , 直接使用 变量类型 变量名称
的方式定义 函数指针 ;
// 根据 函数指针类型 定义 函数指针
func_ptr func2 = add;
4、代码示例 - 不同方式定义函数指针
在下面的代码中 , 分别使用上述章节中讲解的三种方式 , 定义了函数指针 ;
代码示例 :
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 定义函数类型 func , 参数列表是 2 个 int 参数 , 返回值是 int
typedef int (func)(int a, int b);
// 定义函数指针类型 func , 参数列表是 2 个 int 参数 , 返回值是 int
typedef int (*func_ptr)(int a, int b);
// 定义一个函数
int add(int a, int b) {
return a + b;
}
int main()
{
// 根据 函数类型 定义 函数指针
func* func1 = add;
// 根据 函数指针类型 定义 函数指针
func_ptr func2 = add;
// 直接定义 函数指针
int (*func3)(int a, int b) = add;
// 打印 调用结果
cout << "func1(1, 2) = " << func1(1, 2)
<< " , func2(1, 2) = " << func2(1, 2)
<< " , func3(1, 2) = " << func3(1, 2) << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 : 三种方式定义的函数指针都成功
func1(1, 2) = 3 , func2(1, 2) = 3 , func3(1, 2) = 3
Press any key to continue . . .