[原创](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++编程中更加自信地使用函数指针, 编写出高效、可读性强的代码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是代码教父

我的创作动力离不开你的真诚激励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值