【C++】函数重载 ③ ( 为函数指针赋值重载函数 )

2023-10-15 16:50:35 浏览数 (1)

博客总结 :

  • 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;
  • 判定标准 : 只有 函数参数 的 个数 / 类型 / 顺序 的不同 是 " 函数重载 " 的判断标准 , 函数 的 返回值 不是 " 函数重载 " 的 判断标准 ;
  • 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ;
  • 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型 , 自动匹配 重载函数 ;

一、函数指针回顾

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) 类型的函数指针 , 将如下函数赋值给函数指针

代码语言:javascript复制
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 . . .

0 人点赞