博客总结 :
- 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;
- 判定标准 : 只有 函数参数 的 个数 / 类型 / 顺序 的不同 是 " 函数重载 " 的判断标准 , 函数 的 返回值 不是 " 函数重载 " 的 判断标准 ;
- 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ;
- 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型 , 自动匹配 重载函数 ;
一、函数指针回顾
1、函数指针概念
之前的博客 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读) 六. 函数指针 章节中 , 详细介绍了 函数指针 , 以及 函数指针 与 数组 , 其它指针 结合的 复杂指针如何进行解读 ;
" 函数指针 " 是一种 指向函数的指针 , 表示的是 函数地址 , 其指向 函数 而不是 内存数据 ;
借助 " 函数指针 " 可以用来调用函数 ;
" 函数指针 " 也可以 作为函数的 参数 ;
2、函数指针语法
" 函数指针 " 定义语法 :
代码语言:javascript复制return_type (*func_ptr)(parameter_list);
- return_type : 函数指针 指向的函数 的 返回值类型 ;
- func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ;
- parameter_list : 函数指针 指向函数 的 参数列表 ;
" 函数指针 " 示例 : 下面的 函数指针 p 指向一个函数 , 函数的参数是 2 个 int 类型参数 , 函数的返回值是 int 类型 ;
代码语言:javascript复制int (*p)(int, int);
3、代码示例 - 函数指针示例
定义 int (*)(int, int)
类型的函数指针 , 将如下函数赋值给函数指针
int add(int a, int b) {
return a b;
}
可以将 add 直接赋值给函数指针 ,
也可以先使用 & 符号获取 函数地址 &add , 然后再赋值给函数指针 ;
代码语言:javascript复制 // 定义 函数指针 , 将函数地址赋值给 函数指针
int (*func_ptr)(int, int) = add;
int (*func_ptr2)(int, int) = &add;
上述两种赋值都是正确的 , 通过 func_ptr(1, 2) 和 func_ptr2(1, 2) 代码 , 都可以调用到函数 ;
函数指针完整代码示例 :
代码语言:javascript复制// 包含 C 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 定义一个函数
int add(int a, int b) {
return a b;
}
int main()
{
// 定义 函数指针 , 将函数地址赋值给 函数指针
int (*func_ptr)(int, int) = add;
int (*func_ptr2)(int, int) = &add;
// 打印 调用结果
cout << "func_ptr(1, 2) = " << func_ptr(1, 2)
<< " , func_ptr2(1, 2) = " << func_ptr2(1, 2) << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
代码语言:javascript复制func_ptr(1, 2) = 3 , func_ptr2(1, 2) = 3
Press any key to continue . . .
二、为函数指针赋值重载函数
1、为函数指针赋值重载函数
对 函数指针 进行赋值时 , 直接将 函数名 赋值给了 函数指针 ;
如 下面的代码中 , 直接将 add 函数赋值给了 函数指针 func_ptr ;
代码语言:javascript复制int (*func_ptr)(int, int) = add;
如果 代码中 定义了多个 add 重载函数 , 那么 使用 重载函数 对 函数指针 进行赋值 , 就需要进行类型匹配了 ;
使用 int (*func_ptr)(int, int)
代码 , 定义的 函数指针 有 2 个 int 类型的参数 , 有 1 个 int 类型的返回值 ;
为该函数指针 赋值 add 函数 时 , 就会自动 查找 参数列表是 2 个 int 类型的函数 ,
- 如果没有找到 , 就会编译失败 ,
- 如果找到了 , 为函数指针赋值成功 ;
2、代码示例 - 为函数指针赋值重载函数
完整代码示例 :
代码语言:javascript复制// 包含 C 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 定义一个函数
int add(int a, int b) {
return a b;
}
// 定义一个函数
int add(int a, int b, int c) {
return a b c;
}
int main()
{
// 定义 函数指针 , 将函数地址赋值给 函数指针
// 对函数指针进行赋值时 , 会根据函数指针的类型匹配 add 函数
// 显然会匹配到 int add(int a, int b) 函数的地址
int (*func_ptr)(int, int) = add;
// 对函数指针进行赋值时 , 会根据函数指针的类型匹配 add 函数
// 显然会匹配到 int add(int a, int b, int c) 函数的地址
int (*func_ptr2)(int, int, int) = add;
// 打印 调用结果
cout << "func_ptr(1, 2) = " << func_ptr(1, 2)
<< " , func_ptr2(1, 2) = " << func_ptr2(1, 2, 3) << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
代码语言:javascript复制func_ptr(1, 2) = 3 , func_ptr2(1, 2) = 3
Press any key to continue . . .