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



    博客总结 :

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




    一、函数指针回顾




    1、函数指针概念


    之前的博客 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读) 六. 函数指针 章节中 , 详细介绍了 函数指针 , 以及 函数指针 与 数组 , 其它指针 结合的 复杂指针如何进行解读 ;


    " 函数指针 " 是一种 指向函数的指针 , 表示的是 函数地址 , 其指向 函数 而不是 内存数据 ;

    借助 " 函数指针 " 可以用来调用函数 ;

    " 函数指针 " 也可以 作为函数的 参数 ;


    2、函数指针语法


    " 函数指针 " 定义语法 :

    return_type (*func_ptr)(parameter_list);
    
    • 1
    • return_type : 函数指针 指向的函数 的 返回值类型 ;
    • func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ;
    • parameter_list : 函数指针 指向函数 的 参数列表 ;

    " 函数指针 " 示例 : 下面的 函数指针 p 指向一个函数 , 函数的参数是 2 个 int 类型参数 , 函数的返回值是 int 类型 ;

    int (*p)(int, int);
    
    • 1

    3、代码示例 - 函数指针示例


    定义 int (*)(int, int) 类型的函数指针 , 将如下函数赋值给函数指针

    int add(int a, int b) {
    	return a + b;
    }
    
    • 1
    • 2
    • 3

    可以将 add 直接赋值给函数指针 ,

    也可以先使用 & 符号获取 函数地址 &add , 然后再赋值给函数指针 ;

    	// 定义 函数指针 , 将函数地址赋值给 函数指针
    	int (*func_ptr)(int, int) = add;
    	int (*func_ptr2)(int, int) = &add;
    
    • 1
    • 2
    • 3

    上述两种赋值都是正确的 , 通过 func_ptr(1, 2) 和 func_ptr2(1, 2) 代码 , 都可以调用到函数 ;


    函数指针完整代码示例 :

    // 包含 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    执行结果 :

    func_ptr(1, 2) = 3 , func_ptr2(1, 2) = 3
    Press any key to continue . . .
    
    • 1
    • 2

    在这里插入图片描述





    二、为函数指针赋值重载函数




    1、为函数指针赋值重载函数


    对 函数指针 进行赋值时 , 直接将 函数名 赋值给了 函数指针 ;

    如 下面的代码中 , 直接将 add 函数赋值给了 函数指针 func_ptr ;

    int (*func_ptr)(int, int) = add;
    
    • 1

    如果 代码中 定义了多个 add 重载函数 , 那么 使用 重载函数 对 函数指针 进行赋值 , 就需要进行类型匹配了 ;


    使用 int (*func_ptr)(int, int) 代码 , 定义的 函数指针 有 2 个 int 类型的参数 , 有 1 个 int 类型的返回值 ;

    为该函数指针 赋值 add 函数 时 , 就会自动 查找 参数列表是 2 个 int 类型的函数 ,

    • 如果没有找到 , 就会编译失败 ,
    • 如果找到了 , 为函数指针赋值成功 ;

    2、代码示例 - 为函数指针赋值重载函数


    完整代码示例 :

    // 包含 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    执行结果 :

    func_ptr(1, 2) = 3 , func_ptr2(1, 2) = 3
    Press any key to continue . . .
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    React-性能优化的手段
    vue3面试题
    Mac远程连接Windows 11
    剑指offer-刷题笔记-中难题-JZ41 数据流中的中位数
    [Python学习笔记]Requests性能优化之Session
    MySQL 中的反斜杠 \\,我上当了
    Stack Overflow 临时禁用 ChatGPT 生成内容,网友:人类和AI快打起来!
    五、Spring Boot 整合持久层技术(2)
    使用 PPO 算法进行 RLHF 的 N 步实现细节
    MATLAB | 两种上色方式的旭日图绘制
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132713019