询问一个函数对象的问题
问题问的比较杂啊
不好意思啊,现在对这个函数对象以及调用问题不是很清楚啊
有这样一个类
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来代替~
所以应该按类名来理解,不是对象,是生成一个临时对象。。
[解决办法]
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(),这种写法就是错误的??
这种写法是错误的,因为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的原型:
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(...)