首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

询问一个函数对象的有关问题

2012-07-28 
询问一个函数对象的问题问题问的比较杂啊不好意思啊,现在对这个函数对象以及调用问题不是很清楚啊有这样一

询问一个函数对象的问题
问题问的比较杂啊
不好意思啊,现在对这个函数对象以及调用问题不是很清楚啊


有这样一个类
class GT_cls
{
  public:
  GT_cls(size_t val=0):bound(val){}
  bool operator()(const string &s)
  {
  return s.size()>=bound;
  }
 private:
  std::string::size_type bound;
};



 vector<string>::size_type wc=count_if(words.begin(),words.end(),GT_cls(6))


我想请问
GT_cls objt_GT(1);//这个应该是调用构造函数
  objt_GT(1); //那是不是这一句调用那个operator函数啊?如果没有类里面没有定义operator(),这种写法就是错误的??


如果有这样一个类
class A
{public:
  int x;
  A(int xx):x(xx){}
  int operator()(int yy)
  {return yy;} 
};

int main()
{
  A a(1);//此处调用的是构造函数
  a(1);//此处调用的是operator? ,如果类里面没有定义operator,此处为什么报错呢?
  int c=a(1);//此处调用的是operator?
}



然后对于vector<string>::size_type wc=count_if(words.begin(),words.end(),GT_cls(6))
这个地方的GT_cls(6)怎么解释呢?此处的GT_cls是对象还是类名呢?
如果是对象,那要实现对类里面的operator()的调用,那怎么不见形参呢?




[解决办法]
我想请问 
GT_cls objt_GT(1);//这个应该是调用构造函数 
objt_GT(1); //那是不是这一句调用那个operator函数啊?如果没有类里面没有定义operator(),这种写法就是错误的?? 


第一个是构造函数,第二个调用重载(),如果没有重载(),应该是错误的。


int main() 

A a(1);//此处调用的是构造函数 
a(1);//此处调用的是operator? ,如果类里面没有定义operator,此处为什么报错呢? 
int c=a(1);//此处调用的是operator? 



a(1); 调用重载(),如果没有重载(),肯定报错啊,你没定义的函数你就用能不错么?这个函数编译器不会自己生成!
这句相当于 a.operator()(1); "operator()"是函数名。。
int c=a(1); 也是一样的。




然后对于vector <string>::size_type wc=count_if(words.begin(),words.end(),GT_cls(6)) 
这个地方的GT_cls(6)怎么解释呢?此处的GT_cls是对象还是类名呢? 
如果是对象,那要实现对类里面的operator()的调用,那怎么不见形参呢? 


GT_cls(6) 是生成一个临时对象作为函数参数了,GT_cls类的构造函数不是有一个是带参数的嘛GT_cls(size_t val=0):bound(val){}
就是相当于调用这个构造函数生成一个临时对象。参数val用6来代替~
所以应该按类名来理解,不是对象,是生成一个临时对象。。


[解决办法]

C/C++ code
int main() {   A a(1);//此处调用的是构造函数   a(1);//调用的是operator()  int c=a(1);//调用的是operator()}GT_cls(6) //调用的构造函数,把创建的函数对象传递给count_ifoperator()的形参是count_if传递给它的,就是words中的元素
[解决办法]
我想请问 
GT_cls objt_GT(1);//这个应该是调用构造函数 
objt_GT(1); //那是不是这一句调用那个operator函数啊?如果没有类里面没有定义operator(),这种写法就是错误的?? 

在count_if内部的objt_GT(*curr);才是呢。

int cnt = 0;
 for (typename vector<string>::iterator curr = 第一个参数;
curr != 第二个参数;
++curr)
if (objt_GT(*curr)) ++cnt;
return cnt;

代码大概是这样的。

 A a(1);//此处调用的是构造函数 
a(1);//此处调用的是operator? ,如果类里面没有定义operator,此处为什么报错呢?

//没有定义当然报错 
int c=a(1);//此处调用的是operator?
先operator ()返回int,再用int进行构造



然后对于vector <string>::size_type wc=count_if(words.begin(),words.end(),GT_cls(6)) 
这个地方的GT_cls(6)怎么解释呢?此处的GT_cls是对象还是类名呢? 
如果是对象,那要实现对类里面的operator()的调用,那怎么不见形参呢? 

在这里是类名(也可以有变态的做发,把这里弄成对象名)
调用构造函数生成一个无名对象做实参。

[解决办法]
探讨
我想请问
GT_cls objt_GT(1);//这个应该是调用构造函数
objt_GT(1); //那是不是这一句调用那个operator函数啊?如果没有类里面没有定义operator(),这种写法就是错误的??


第一个是构造函数,第二个调用重载(),如果没有重载(),应该是错误的。


int main()
{
A a(1);//此处调用的是构造函数
a(1);//此处调用的是operator? ,如果类里面没有定义operator,此处为什么报错呢?
int c=a(1);//此处…


[解决办法]
GT_cls objt_GT(1);//这个应该是调用构造函数 
正确

objt_GT(1); //那是不是这一句调用那个operator函数啊?如果没有类里面没有定义operator(),这种写法就是错误的?? 
这种写法是错误的,因为1不能直接转成std::string

count_if是用来进行条件比较的,传进去的GT_cls(6)是一个对象,就是用来,它会调用这个对象的()操作符进行比较。
[解决办法]
GT_cls(6);生成了个临时的对象
[解决办法]
我想请问 
GT_cls objt_GT(1);//这个应该是调用构造函数 
objt_GT(1); //那是不是这一句调用那个operator函数啊?如果没有类里面没有定义operator(),这种写法就是错误的?? 
没有定义operator,编译器找不到调用方法,报错


A a(1);//此处调用的是构造函数 
a(1);//此处调用的是operator? ,如果类里面没有定义operator,此处为什么报错呢? 
int c=a(1);//此处调用的是operator? 没错!!!!!!!!!!!!!!
道理一样,没有定义,从哪里调用,编译器默认生成的只是默认构造函数、默认析构、默认拷贝、默认赋值


GT_cls(6)生成一个bound值为6的GT_cls对象,但是参与count_if运算的是:bool operator()(const string &s) 

return s.size()>=bound; 

你要了解count_if的原型:

C/C++ code
template <class InputIterator, class Predicate>  typename iterator_traits<InputIterator>::difference_type    count_if ( ForwardIterator first, ForwardIterator last, Predicate pred );其操作类似为:template <class InputIterator, class Predicate>  ptrdiff_t count_if ( InputIterator first, InputIterator last, Predicate pred ){  ptrdiff_t ret=0;  while (first != last) if (pred(*first++)) ++ret;  return ret;}
[解决办法]
objt_GT(1); 实际上是objt_GT.operator()(1) 的缩写
同样int c=a(1); 是int c = a.operator()(1)的缩写,
GT_cls(6)实际上是GT_cls temp(6)的缩写.
把函数对象的调用当成普通成员函数就可以了,只不过对x.operator()(...)的调用可以省略成x(...)

热点排行