当前位置: 首页 > news >正文

[原创](Modern C++)现代C++的关键性概念: 如何正确地返回函数指针?

[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、
开发工具: Visual Studio、Delphi、XCode、C++ Builder、Eclipse
技能种类: 逆向 驱动 磁盘 文件 大数据分析
涉及领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 股票模型量化/磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
专注研究: 机器学习、股票模型量化、金融分析

[序言]
在C++编程中, 函数指针是一种强大且灵活的工具, 它允许将函数作为参数传递给其他函数, 或者从函数中返回一个函数指针, 从而实现动态的函数调用. 这种特性在需要实现回调机制、事件处理或动态行为时尤为有用. 然而, 由于函数指针的语法较为复杂, 尤其是在返回函数指针的场景下, 往往会感到困惑. 现代C++通过引入using关键字等特性, 使得函数指针的声明和使用变得更加直观和简洁.

[代码演示]

#include <iostream>
#include <string>
#include <io.h>
#include <fcntl.h>

// 函数类型的声明方式
// 1. 使用using关键字定义函数类型
using FUN_TYPE_SAYS_1 = std::wstring(std::wstring, std::wstring);
// 2. 使用typedef关键字定义函数类型
typedef std::wstring FUN_TYPE_SAYS_2(std::wstring, std::wstring);

// 函数指针的声明方式
// 1. 使用using关键字定义函数指针类型
using POINTER_FUN_SAYS_1 = std::wstring (*)(std::wstring, std::wstring);
// 2. 使用typedef关键字定义函数指针类型
typedef std::wstring (*POINTER_FUN_SAYS_2)(std::wstring, std::wstring);

// 普通函数: 接受两个wstring参数并返回它们的拼接结果
std::wstring fun_Says(std::wstring wstr_param_1, std::wstring wstr_param_2) {
    return wstr_param_1 + L" " + wstr_param_2;
}

// 返回函数指针的函数
// 写法1: 直接指定返回类型为函数指针
std::wstring (*fun_Get_fun_Says_Pointer_1())(std::wstring, std::wstring) {
    return fun_Says;
}

// 写法2: 使用预定义的函数指针类型作为返回类型
POINTER_FUN_SAYS_1 fun_Get_fun_Says_Pointer_2() {
    return fun_Says;
}

// 写法3: 使用函数类型并加*表示返回函数指针
FUN_TYPE_SAYS_1 *fun_Get_fun_Says_Pointer_3() {
    return fun_Says;
}

int main() {
    // 设置输出模式以支持宽字符
    _setmode(_fileno(stdout), _O_WTEXT);

    std::wstring wstr_SayWhat{ L"" };

    // 使用写法1返回的函数指针
    POINTER_FUN_SAYS_1 pointer_fun_Say_1 = fun_Get_fun_Says_Pointer_1();
    wstr_SayWhat = pointer_fun_Say_1(L"Hello", L"World");

    // 使用写法2返回的函数指针
    POINTER_FUN_SAYS_1 pointer_fun_Say_2 = fun_Get_fun_Says_Pointer_2();
    wstr_SayWhat = pointer_fun_Say_2(L"Hello", L"World");

    // 使用写法3返回的函数指针
    FUN_TYPE_SAYS_1* pointer_fun_Say_3 = fun_Get_fun_Says_Pointer_3();
    wstr_SayWhat = pointer_fun_Say_3(L"Hello", L"World");

    // 直接声明函数指针并赋值
    std::wstring(*pointer_fun_Say_4)(std::wstring, std::wstring) = fun_Get_fun_Says_Pointer_1();
    wstr_SayWhat = pointer_fun_Say_4(L"Hello", L"World");

    // 输出结果
    std::wcout << wstr_SayWhat << std::endl;

    std::cin.get();
    return 0;
}

[代码说明]
1. 返回函数指针的三种写法
   1.1 写法1: 直接指定返回类型为函数指针: std::wstring (*fun_Get_fun_Says_Pointer_1())(std::wstring, std::wstring) 明确声明返回一个函数指针, 语法虽然清晰但较为冗长.

   1.2 写法2: 使用预定义的函数指针类型: POINTER_FUN_SAYS_1 fun_Get_fun_Says_Pointer_2() 使用已定义的POINTER_FUN_SAYS_1类型作为返回类型, 这种方式利用类型别名, 代码更简洁, 可读性更高. 

   1.3 写法3: 使用函数类型加*: FUN_TYPE_SAYS_1 *fun_Get_fun_Says_Pointer_3() 表示返回一个指向FUN_TYPE_SAYS_1类型函数的指针, 这种写法结合了函数类型和指针的概念, 语法上稍显灵活.

[总结]
在现代C++中掌握正确地返回函数指针的核心方法和关键概念, 就能够在现代C++编程中更加自信地使用函数指针, 编写出高效、可读性强的代码.

相关文章:

  • 【Linux高级IO(一)】理解五种IO模型
  • MySQL篇(一):慢查询定位及索引、B树相关知识详解
  • springboot整合Thymeleaf web开发出现Whitelabel Error Page
  • R语言——获取数据1
  • Python Websockets库深度解析:构建高效的实时Web应用
  • MySQL和Oracle常见语法差异详解
  • 【Easylive】AppInterceptor和WebAppConfigurer 基于 Token 的请求拦截验证机制
  • 高级java每日一道面试题-2025年3月20日-虚拟化操作系统篇[Docker篇]-如何控制docker容器的启动顺序?
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(12)
  • 文件系统--软硬链接/动静态库
  • C# 窗体应用(.FET Framework ) 打开文件操作
  • 万字解析Spring简易版实现方案!
  • Linux系统安装RabbitMQ
  • Unity中 粒子系统使用整理(一)
  • H.264编码解析与C++实现详解
  • Jenkins详细安装配置部署
  • php根据一个数组里面的元素顺序来排序另外一个数组的的顺序
  • 主相机绑定小地图
  • C# FileStream 使用详解
  • 什么是大数据?
  • 央行行长详解降准:将释放长期流动性1万亿,整体存款准备金率平均水平降至6.2%
  • 无人机穿越大理崇圣寺千年古塔时“炸机”,当地:肇事者已找到,将被追责
  • 胡祥|人工智能时代:文艺评论何为?
  • 什么让翻拍“语文”成为短视频新风潮
  • 国防部新闻发言人就日本民用飞机侵闯中国钓鱼岛领空答问
  • 马斯克的“星舰基地”成为新城镇,首任市长为SpaceX员工