亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C++用類封裝函數有什么好處么?

C++用類封裝函數有什么好處么?

瀟瀟雨雨 2019-04-19 16:11:23
看有的代碼可以用函數實現,卻用類來封裝.具體例子是這樣:比如STL的list容器,sort的函數可以自定義一般這樣處理://comparison,notcasesensitive.boolcompare_nocase(stringfirst,stringsecond){unsignedinti=0;while((i
查看完整描述

2 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

上面那種是functions,下面這種叫做functors.(我姑且翻譯成函子)
兩者最本質的區別在于,上面僅僅是一個過程;而下面,卻可以包含狀態。后者,可以輕松實現閉包。
在C++11里面,后者直接演化為lambda了。
我就用你提到的sort來舉一個小例子:
cppboolmyfunction(inti,intj){return(i
structmyclass{
booloperator()(inti,intj){return(i}myobject;
std::vectormyvector{32,71,12,45,26,80,53,33};
std::sort(myvector.begin(),myvector.end(),myfunction);
std::sort(myvector.begin(),myvector.end(),myobject);
簡化了你的例子,我們來關注本質區別??雌饋?,好像等效對不?
那么現在需求變了,排序的時候,我只希望排值大于40的元素,請問咋整,你說,只好把這個40寫到函數里了。那如果我說這個40是來自用戶輸入呢?也可能是50或是60,請問怎么辦?
此時,function好像有點沒有用武之地了。但我們的functor卻依然可以大顯身手。
cppstructmyclass{
intflag;
myclass(inti):flag(i){}
booloperator()(inti,intj){return((flag};
std::vectormyvector{32,71,12,45,26,80,53,33};
myclassmyobject(40);
std::sort(myvector.begin(),myvector.end(),myobject);
//output:3212263345537180
例子可能有點怪。。但你明白這意思了么?
                            
查看完整回答
反對 回復 2019-04-19
?
MM們

TA貢獻1886條經驗 獲得超2個贊

這個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((iif(tolower(first[i])++i;
}
if(first.length()elsereturnfalse;
}
};
這樣你從首字符開始比較就可以mylist.sort(mylistSort(1));而當你需要忽略首字符,從第二個字母開始比較的時候就可以mylist.sort(mylistSort(2));
這樣就輕松避免了全局變量的狀態管理。
事實上functor還有很多其他好處,特別是配合template來寫,會發揮很大作用!
對了,C++11的話,可以這樣寫
cppmylist.sort([](stringfirst,stringsecond){
//比較邏輯
});
C++14的話還能把它改成auto~~
                            
查看完整回答
反對 回復 2019-04-19
  • 2 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號