C++函数指针简介
2015-10-24 12:33
399 查看
1.函数指针简介
1.1函数指针的用法
简单回顾函数指针的用法。#include <iostream> using namespace std; int add(int i,int j) { return i+j; } int main() { //用法一 int(*addP)(int,int)=add; int tmp=addP(2,3); //或者 //int(*addP)(int,int)=&add; //int tmp=(*addP)(2,3); //用法二 typedef int(*AddP)(int,int); AddP funcP=add; tmp=funcP(2,3); cout<<tmp<<endl; }
编译运行结果输出5。定义和使用函数指针,需要注意以下几点。
(1)定义函数指针的语法形式比较复杂,常借助于typedef类型定义符来简化函数指针的定义。
(2)函数名代表了函数的入口地址,在位函数指针赋值时,funcP=add;和funcP=&add;都可以。再利用函数指针实现函数调用时,funcP(2,3); (*funcP)(2,3);都是正确的。
(3)可以使用reinterpret_cast类型转换操作符对不同类型的函数指针进行转换,但需要谨慎操作。当然,也要尽量避免功能过于强大的C风格的强制类型转换。
(4)有一种函数叫做“回调函数”(callback function),可以将毁掉函数理解成通过函数指针调用的函数。
1.2函数指针作为参数传递
当函数指针作为另一个函数的参数传递时,对函数指针的生命可以采用“显示”的方式进行,也可以采用“隐式”的方式进行。见下面具体例子。#include <iostream> using namespace std; int f(){ return 1; } void invoke0(int(*func)()){ //显示声明函数指针 cout<<(*func)()<<endl; } void invoke1(int func()){ //隐式声明函数指针 cout<<func()<<endl; } int main(){ invoke0(f); invoke1(f); }
2. 指向类成员函数的函数指针的用法
2.1函数指针指向类静态成员函数
对于外部函数,C++沿用了C语言中对函数指针的定义和使用规范。对于类静态成员函数可以理解成“作用域受限的外部函数”,因此,通过以下以下形式即可将类静态成员函数赋值给函数指针。函数指针=类名::函数名;
调用函数指针时与调用指向外部函数的函数指针方式相同。
2.2函数指针指向类非静态成员函数
在C++语言中,由于面向对象机制的引入,程序中不但有外部函数,还有类对象的成员函数。对于类的非静态成员函数而言,函数指针要以对象的”成员指针”的形式定义和赋值。#include <iostream> using namespace std; class A{ public: int retInt(){ cout<<"in A member function"<<endl; return 100;}; }; int main() { A a; int(A::*funcP)()=&A::retInt; (a.*funcP)(); }
运行输出结果:In A member function。
(1)当函数指针指向类成员对象时,对函数指针的定义必须加上类名以及::(作用域运算符)标识该函数指针指向哪个类的成员函数。
(2)调用函数指针所指向的类成员函数时,必须同时指明函数所操作的类对象,类似于成员函数的访问。
参考文献
[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.7(P106-P110)]相关文章推荐
- C语言:不使用(a+b)/2这种方式(会溢出),求两个数的平均值
- C语言:编写函数将一个整数的二进制位模式从左到右翻转后的值输出
- C语言:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同(模除、移位)
- c语言 常量
- C++ 栈
- 总结sublime c++编译环境搭建 | 中文乱码问题解决方案 |sidebar配置 |sublime最佳插件列表|最佳主题方案
- C++ STL 排序(Sort)
- STL之hashset实现
- [C++] Operator Overload
- 黑马程序员——OC语言日志——NSString前后缀的检查和NSRang的使用
- C++成员初始化列表详解
- 【C语言】 求一个数的二进制反转后的值
- C++学习笔录1
- C++ string 用法概览
- 无法上csdn博客的解决方法&cxalloc.cpp(111)&程序可以单步调通,裸奔不行
- Web Socket rfc6455 握 (C++)
- IOS开发笔记7-函数-C语言笔记
- char,short ,int ,long,long long,unsigned long long数据范围
- C语言中cos(x)或sin(x),x输入的是弧度,怎么输入角度
- Leetcode Minimum Size Subarray Sum