C++中的函数指针
2015-10-23 14:23
441 查看
玩法1 – 函数指针的基本定义方式与使用方法
示例
void func1() { cout << __FUNCTION__ << endl; } int main() { void (*funcPtr1)() = func1; funcPtr1(); return 0; }
输出结果:
func1
最简单的函数指针使用方法。定义函数指针时,指针类型必须与所要指向的函数类型一致,其后的参数类型也必须一致。使用函数指针时,只需将函数指针看作所指向的函数即可,相当于给函数起了个别名。
玩法2 – 函数指针更常用的定义方式
示例
typedef void (*FuncPtr2)(); void func2() { cout << __FUNCTION__ << endl; } int main() { FuncPtr2 funcPtr2 = func2; funcPtr2(); return 0; }
输出结果:
func2
这里是将函数指针重新做了定义,相当于一个新的类型。一般也都是使用这种方式,因为更加简单、直观。
玩法3 – 函数指针做形参
示例
typedef void (*FuncPtr3)(); void func3_1() { cout << __FUNCTION__ <<endl; } void func3_2() { cout << __FUNCTION__ <<endl; } void func3_3() { cout << __FUNCTION__ <<endl; } void func3(FuncPtr3 func) { func(); } int main() { func3(func3_1); func3(func3_2); func3(func3_3); return 0; }
输出结果:
func3_1
func3_2
func3_3
玩法4 – 函数返回值为函数指针
示例
typedef void (*FuncPtr4)(); void func4_1() { cout << __FUNCTION__ <<endl; } FuncPtr4 func4() { return func4_1; } int main() { FuncPtr4 func = func4(); func(); return 0; }
输出结果:
func4_1
函数func4()中将另一个函数func4_1()的名字作为了返回值,外部通过一个函数指针接收并调用该函数。
玩法5 – 将函数指针加入map中
示例
typedef void (*FuncPtr5)(); void func5_1() { cout << __FUNCTION__ <<endl; } void func5_2() { cout << __FUNCTION__ <<endl; } void func5_3() { cout << __FUNCTION__ <<endl; } int main() { map<string, FuncPtr5> m; m.insert(pair<string, FuncPtr5>("func1", func5_1)); m.insert(pair<string, FuncPtr5>("func2", func5_2)); m.insert(pair<string, FuncPtr5>("func3", func5_3)); m.find("func1")->second(); FuncPtr5 func = m.find("func3")->second; func() a492 ; return 0; }
输出结果:
func5_1
func5_3
除了map外,其他容器均可类似地使用函数指针。
玩法6 – 函数指针所指向的函数为成员函数
示例
class Func6Class { public: typedef void (Func6Class::*FuncPtr6)(); void func6_1() { cout << __FUNCTION__ <<endl; } void func6() { FuncPtr6 func = &Func6Class::func6_1; (this->*func)(); } }; int main() { Func6Class func; func.func6(); return 0; }
输出结果:
func6_1
需要特别注意的是在
FuncPtr6 func = &Func6Class::func6_1;语句中, 必须有
&,否则编译会报错:
error: cannot convert 'Func6Class::func6_1' from type 'void (Func6Class::)()' to type 'Func6Class::FuncPtr6 {aka void (Func6Class::*)()}'
在调用时也不能像之前直接使用
func(),而必须使用
(this->*func)();,否则报错:
error: must use '.*' or '->*' to call pointer-to-member function in 'func (...)', e.g. '(... ->* func) (...)'
至于原因,应该可以参考《C++ 必知必会》第16条:
指向成员函数的指针并非指针
玩法7 – 在类外调用指向成员函数的函数指针
示例
class Func7Class { public: void func7() { cout << __FUNCTION__ <<endl; } }; typedef void (Func7Class::*FuncPtr7)(); Func7Class func; FuncPtr7 funptr = &Func7Class::func7; (func.*funptr)();
输出结果:
func7
与之前不同的是,这里需要通过对象来调用函数指针。而前面使用的是this。
总结:
函数指针类型定义:
非成员函数:
typedef 函数返回类型 (*函数指针名)(参数类型列表);成员函数:
typedef 函数返回类型 (类名::*函数指针名)(参数类型列表);函数指针定义:
非成员函数:
函数指针名 指针变量名 = 函数名;成员函数:
函数指针名 指针变量名 = &类名::函数名;函数指针使用:
非成员函数:
指针变量名(形参列表);成员函数:
(对象.*指针变量名)(形参列表);(对象指针->*指针变量名)(形参列表);
类体内:
(this->*指针变量名)(形参列表);相关文章推荐
- 九度王道考研机试真题 2010-2北邮 题目1173:查找.cpp
- c/c++内存管理注意的问题
- [C++] [算法] KMP算法
- C++ 类的静态成员详细讲解
- vs中建立动态链接库的步骤
- C++学习笔记33 转换操作符
- C++ MFC中的CMenu---动态添加菜单/菜单项
- 基于51单片机SJA1000 CAN通讯实现(C语言程序)
- C++多级指针的”解引用“
- 2015年奇虎360服务器开发C++电话面试问题
- Java, C++ 单例模式与静态成员初始化对比
- 求最大公约数 1.0
- C++STL之priority_queue优先队列容器
- C++——将成员函数作为参数
- Leetcode Next Permutation
- c++ de-mangle 反编译器命名工具:c++filt
- C++笔试题 字符串的比较,全排列,类似 和分解的问题
- 所用的软件是visualc++6.0绿色版,点击运行后出现[local]1[/local]
- c语言学习之基础知识点介绍(五):关系运算式和逻辑运算式
- 微软承诺将在今年的 Visual C++ 更新中加入 Clang 编译器