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