浅析C++函数指针和函数对象
来源:互联网 发布:江苏卫视网络在线直播 编辑:程序博客网 时间:2024/06/07 15:13
C/C++代码中常见函数指针的使用,C++中经常碰到函数对象这种用法,在此简单总结。
1.函数指针
函数指针(function pointer)就是指向某函数的指针变量,即指向所谓的函数入口地址。函数指针的基本作用就是调用函数,另一重要作用是作函数的参数。
函数指针的声明:返回值类型 ( * 指针变量名) ([形参列表]);
注意 ( * 指针变量名) 的括号不可省略,它能告诉编译器声明的为一个函数指针而不是返回值为指针类型的函数。
例如一个普通函数声明为:int func(int a); 函数指针声明方法为:int (*func) (int a);
简单起见可用typedef声明为:typedef int (*func) (int a); 直接使用 func f; 便可定义一个函数指针
举例1:调用函数
typedef void (*func) (int a);void foo(int a){ std::cout << a << std::endl;}int main(){ func f = foo; f(1); return 0;}
举例2:作函数的参数
typedef int (*add) (int a, int b);int foo(int a, int b){ return a + b;}void bar(int a, int b, add f){ std::cout << f(a, b) << std::endl;}int main(){ add f = foo; bar(1, 2, f); return 0;}
2.函数对象
函数对象(function object),又称仿函数(functor),是C++相较于C的一大特性。顾名思义,函数对象首先是一个对象,其特点是重载了()运算符,该对象有了某个函数的功能。从功能上来说函数对象和函数指针的作用基本相同,但前者能使程序设计更加灵活高效,完全可以取代函数指针。
例如定义一个简单的函数对象:
class FuncObj{public: void operator () () { std::cout << "hello\n"; }};int main(){ FuncObj a; a();//FuncObj类重载了()操作符,因此可像调用普通函数一样调用对象 return 0;}
举例1:函数对象作函数的参数
class FuncObj{public: int operator() (int a, int b) { return a + b; }};void foo(int a, int b, FuncObj& f){ std::cout << f(a, b) << std::endl;}int main(){ FuncObj f; foo(1, 2, f); return 0;}
class FuncObj{public: template <class T> T operator() (T a, T b) { return a + b; }};template <class T>void foo(T a, T b, FuncObj& f){ std::cout << f(a, b) << std::endl;}int main(){ FuncObj f; foo(1, 2, f); foo(3.14, 2.72, f); return 0;}此类技术在STL中得到广泛应用。
应用:STL priority_queue自定义比较类
struct Node { int n; Node(int _n):n(_n){} }; //自定义比较类 struct cmp { bool operator() (const Node &a, const Node &b) { return a.n > b.n; } }; int main() { //声明一个优先队列pq priority_queue<Node, vector<Node>, cmp> pq; }
阅读全文
3 0
- 浅析C++函数指针和函数对象
- 函数指针和函数对象
- 函数指针和函数对象
- 函数指针和函数对象
- 函数指针和函数对象
- 函数指针 和 函数对象
- 函数对象和函数指针
- 函数指针和函数对象
- 函数指针和函数对象
- 函数指针和函数对象
- 函数对象和函数指针
- 函数指针和函数对象
- 函数指针和函数对象
- 函数指针和函数对象
- 函数对象和函数指针
- 【c/c++】指针函数和函数指针
- C、C++指向函数的指针(函数指针)浅析
- C 指针和函数
- Java反射
- 1029. 旧键盘(20)
- Unable to load class 'org.gradle.api.internal.component.Usage'
- 段错误之一记录(11.12课程代码出现的问题)
- 用Prismjs给自己的博客文章增加代码高亮功能
- 浅析C++函数指针和函数对象
- jsp生成json数据
- 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。
- 教你如何使用Gerrit
- Android application的label 和Activity的label 的区别
- 线段树的入门
- jQuery获取Select选择的Text(文本信息)和 Value属性的值,select语法解释;单选框和复选框
- 配置Tomcat使用HTTPS协议
- openstack【Kilo】入门 【keystone篇】八:验证keystone安装部署