C++中的函数指针
来源:互联网 发布:手机校音器软件 编辑:程序博客网 时间:2024/06/08 04:20
玩法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(); 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->*指针变量名)(形参列表);
- c中的函数指针
- C中的函数指针
- c语言中的函数指针
- C语言中的函数指针
- C中的函数指针使用
- C中的函数指针使用
- C语言中的函数指针
- C语言中的函数指针
- c/c++中的函数指针
- C语言中的函数指针
- C中的函数指针使用
- C语言中的函数指针
- c语言中的函数指针
- C语言中的函数指针
- C/C++中的函数指针
- C语言中的函数指针
- c语言中的指针函数
- C语言中的函数指针
- C#执行定时计算限制操作(计时器)
- 项目稳定回报论证—大数据进入价值变现的2.0时代
- [php] thinkphp基于Http类 下载文件
- Java语言基础(三)
- 死锁、进程通信以及进程线程的区别
- C++中的函数指针
- sigaction,SA_RESTART
- android 获取控件高度
- Linux设置默认启动命令行,而不是图形界面
- Linux diff与patch的深入分析
- android socket 通信
- Android项目:简易版QQ的实现
- 并行计算
- 在Ubuntu 14.04 64bit上搭建单机本地节点Spark 1.3.0环境