C++用类封装函数有什么好处么?

看有的代码可以用函数实现,却用类来封装.
具体例子是这样:
比如STL的list容器,sort的函数可以自定义
一般这样处理:
//comparison,notcasesensitive.
boolcompare_nocase(stringfirst,stringsecond)
{
unsignedinti=0;
while((i{
if(tolower(first[i])++i;
}
if(first.length()elsereturnfalse;
}
mylist.sort(compare_nocase);
这个是c++参考手册的例子,项目中我看到好多地方这么用了
structmylistSort{
booloperator()(stringfirst,stringsecond)const{
//todo
}
};
mylist.sort(mylistSort());
这样有很明显的好处还是单纯的风格问题,完全等价?
月关宝盒
浏览 427回答 2
2回答

潇湘沐

上面那种是functions,下面这种叫做functors.(我姑且翻译成函子)两者最本质的区别在于,上面仅仅是一个过程;而下面,却可以包含状态。后者,可以轻松实现闭包。在C++11里面,后者直接演化为lambda了。我就用你提到的sort来举一个小例子:cppboolmyfunction(inti,intj){return(i

慕斯709654

这个struct其实是functor,国内译成仿函数,它的好处是可以保存状态。我举个例子,你现在用compare_nocase的函数指针作为参数,假如突然又有一个地方要求你比较字符串,但此时要求你忽略首字母,从第二个字符串开始比较,那么你应该怎么做?1.要么你重新写一个compare_nocase2函数,但会造成大量重复代码。2.要么你弄个intstart变量,然后放在compare_nocase的外面,在执行我刚才说的这个需求时候,先改变start=2,执行完以后再把全局变量改回去。可以看到,都不优雅。或许你想到了把compare_nocase写到一个类里,但这必须要是staticmethod。而functor的解决很简单。cppstructmylistSort{intstart;mylistSort(intp){start=p;}booloperator()(stringfirst,stringsecond)const{inti=start-1;while((i
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript