Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60441
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 267
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-29 13:17
文章分类

全部博文(34)

文章存档

2014年(1)

2013年(33)

我的朋友

分类: C/C++

2013-09-05 09:03:34

一:调用操作符重载:我们可以为类类型的对象重载调用操作符即小括弧”()“,定义了调用操作符的类,在使用定义的调用操作符时,行为就像是调用函数,所以这种对象称为函数对象,即行为类似函数的对象:

如下例子为类A定义了调用操作符,功能是返回一个绝对值:

class A

{

  public:

    int operator() (int val)

    {

      return val < 0 ? -val : val;

    }

};

调用操作符使用以下两种方法都可以:

A a;

int n = a.operator()(-1);

int n = a(-1); //使用方式像是调用了一个函数

调用操作符可以重载多个版本,通过函数形参的类型及数目区分,如再为类A重载一个形参类型为char *的调用操作符函数:

void operator(char *p)

{

    *p = '\0';

}

使用以上调用操作符:

char arr[] = "ABC";

char *pa = arr;

a.operator()(pa);

a(pa);

二:函数对象用于标准库算法:

a:例如查找比指定值大的数,可以先定义一个类B,为其定义调用操作符,使用该类的对象实现查找:

class B

{

  public:

    B(int val = 0) : ival(val) {} //构造函数初始化成员 ival;

    bool operator()(const int &v)

    {

      return v > ival;  //返回真值,如果传递进来的实参大于成员ival,ival在调用构造函数时被初始化;

    }

  private:

    int ival;

};

用标准库算法find_if进行查找,比如查找大于10的数:

int b[] = {1, 52, 12, 30, 9, 19};

vector ivec(b, b+6);

 vector::iterator ite = ivec.begin();
  while((ite = find_if(ite, ivec.end(), B(10))) != ivec.end())
  {
    cout << *ite << " ";
    ite++;
  }

find_if函数的第三个参数是一个接受一个参数并返回bool型的函数,在这里我们可以传递给find_if算法函数一个类类型B的临时对象,通过传递值10给构造函数初始成员ival,现在find_if每次调用它的函数形参时,依次将vector中的每个元素都应用类B的调用操作符,然后该操作符根据成员ival的值,对传进的实参即vector的每个元素进行比较,如果函数对象返回为真,则find_if返回指向该元素的迭代器;


b:统计大于指定值的次数,以上述代码为基础:

int n = count_if(ivec.begin(), ivec.end(), B(10));

同样,count_if以函数调用的方式调用类B调用操作符,对vector中每个元素进行比较,如果为真,则计数器加1,知道vector的末端元素;

全部代码:


  1. #include <iostream>  
  2. #include <vector>  
  3. #include <algorithm>  
  4.   
  5. using namespace std;  
  6.   
  7. class A  
  8. {  
  9.   public:  
  10.     int operator() (int val)  
  11.     {  
  12.       return val > 0 ? val : -val;  
  13.     }  
  14.   
  15.     void operator() (char *p)  
  16.     {  
  17.       *p = 'B';  
  18.     }  
  19. };  
  20.   
  21. class B  
  22. {  
  23.   public:  
  24.     B(int val = 0) : ival(val) {} //构造函数初始化成员 ival;  
  25.     bool operator()(const int &v)  
  26.     {  
  27.       return v > ival;  //返回真值,如果传递进来的实参大于成员ival,ival在调用构造函数时被初始化;  
  28.     }  
  29.   
  30.   private:  
  31.     int ival;  
  32. };  
  33.   
  34. int main()  
  35. {  
  36.   int i = -42;  
  37.   A  a;  
  38.   unsigned int ui = a(i);  
  39.  // unsigned int ui = a.operator()(i);  
  40.   cout << ui << endl;  
  41.   char arr[] = "ABC";  
  42.   char *pa = arr;  
  43.   a(pa);  
  44.   //a.operator()(pa);  
  45.   cout << pa << endl;  
  46.   
  47.   int b[] = {1, 52, 12, 30, 9, 19};  
  48.   vector<int> ivec(b, b+6);  
  49.   vector<int>::iterator ite = ivec.begin();  
  50.   while((ite = find_if(ite, ivec.end(), B(10))) != ivec.end())  
  51.   {  
  52.     cout << *ite << " ";  
  53.     ite++;  
  54.   }  
  55.   cout << endl;  
  56.   
  57.   int n = count_if(ivec.begin(), ivec.end(), B(10));  
  58.   cout << "n:" << n << endl;  
  59.   
  60.   return 0;  
  61. }  

运行结果:


42
BBC
52 12 30 19 
n:4
上述代码g++编译通过!

阅读(531) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~