effective3关于函数对象的理解
来源:互联网 发布:bluebird.js 编辑:程序博客网 时间:2024/06/06 03:14
转自http://blog.csdn.net/huang_xw/article/details/7934156
在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C++函数对象的相关介绍。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了。这是入门级的随笔,说的是函数对象的定义,使用,以及与函数指针,成员函数指针的关系。
C++函数对象实质上是一个实现了operator()--括号操作符--的类。下面是函数对象与函数指针的例子:
- namespace
- {
- class AddCls
- {
- public:
- int operator()(int a, int b)
- {
- return a + b;
- }
- };
- int AddFunc(int a, int b)
- {
- return a + b;
- }
- }
- void test_addObj()
- {
- // 定义函数对象
- AddCls addObj;
- PRINT_DEBUG(addObj(3, 4);
- }
- void test_addFunPtr()
- {
- typedef int (*FunPtr) (int a, int b);
- FunPtr addFunPtr = &AddFunc;
- PRINT_DEBUG(addFunPtr(3, 5));
- }
既然C++函数对象与函数指针在使用方式上没什么区别,那为什么要用函数对象呢?很简单,函数对象可以携带附加数据,而指针就不行了。下面就举个使用附加数据的例子:
- class less
- {
- public:
- less(int num):n(num){}
- bool operator()(int value)
- {
- return value < n;
- }
- private:
- int n;
- };
- less isLess(10);
- cout << isLess(9) << " " << isLess(12); // 输出 1 0
- const int SIZE = 5;
- int array[SIZE] = { 50, 30, 9, 7, 20};
- // 找到小于数组array中小于10的第一个数的位置
- int * pa = std::find_if(array, array + SIZE, less(10));
- // pa 指向 9 的位置
- // 找到小于数组array中小于40的第一个数的位置
- int * pb = std::find_if(array, array + SIZE, less(40));
- // pb 指向 30 的位置
- template<typename FUNC>
- int count_n(int* array, int size, FUNC func)
- {
- int count = 0;
- for(int i = 0; i < size; ++i)
- if(func(array[i]))
- count ++;
- return count;
- }
- const int SIZE = 5;
- int array[SIZE] = { 50, 30, 9, 7, 20};
- cout << count_n(array, SIZE, less(10)); // 2
- // 用函数指针也没有问题:
- bool less10(int v)
- {
- return v < 10;
- }
- cout << count_n(array, SIZE, less10); // 2
0 0
- effective3关于函数对象的理解
- 关于对象的理解
- 关于面向对象的理解
- 关于面向对象的理解
- 关于面向对象的理解
- 关于Javascript对象的理解
- 关于面向对象的理解
- 关于JavaScript中函数的定义、对象以及对象实例化的理解
- 关于对象指针与对象的理解
- 关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解
- 关于lowlevel_init函数的理解
- 关于虚函数的理解
- 关于getch()函数的理解
- 关于getchar函数的理解
- 关于函数指针的理解
- 关于构造函数的理解
- 关于copyto函数的理解
- 关于核函数的理解
- String处理工具类
- java跳出多重循环
- Nginx负载平衡 + Tomcat + 会话存储Redis配置要点
- 富士通dpk2085打印机驱动
- Android中两种获取状态栏高度的方法
- effective3关于函数对象的理解
- web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法
- Selenium 初学笔记--Selenium IDE-简单使用
- Eclipse安装Freemarker Editor插件
- Android studio debug 模式 使用release签名
- CEF使用的几个注意点
- 数据仓库---JPivot连接MySQL VS PostgreSQL
- Python的getattr(),setattr(),delattr(),hasattr()
- Buffer overflows 缓冲区溢出