如何使用C++函數(shù)對象?
C++函數(shù)對象是通過一張?zhí)摵瘮?shù)表來實現(xiàn)的。簡稱為V-Table。在這個表中,主是要一個類的虛函數(shù)的地址表,這張表解決了繼承、重載的問題,保證其容真實反應(yīng)實際的函數(shù)。
適合對屬于基本數(shù)據(jù)類型的對象排序,它使用<作為排序比較規(guī)則,第2種語法則是根據(jù)指定排序規(guī)則comp來進行排序,其中comp參數(shù)就是一個函數(shù)對象。如果要排序的對象不是如int,float等簡單類型或不想使用<作為排序規(guī)則的話就得使用第2種語法。
指定一個函數(shù)對象來作為排序規(guī)則(函數(shù)對象)進行排序,那函數(shù)對象究竟是什么了,其實簡單地說它就是一些使用起來像調(diào)用函數(shù)一樣的對象,如:一般的函數(shù),函數(shù)指針,或重載了()運算符的類的實例等,使用這些對象的方式好像調(diào)用函數(shù)一樣所以稱這些對象為C++函數(shù)對象,如下就是函數(shù)對象定義:
- void print(int x)
- {
- if(x>=0&&x<=100) cout<<x<<” ”;
- }
- //函數(shù)對象指針
- typedef void(*ptPrint)(int x);
- ptPrint prt=print;
- //一個重載了()運算符得類
- class isOk
- {
- public:
- bool operator () (int val)
- {
- if(val<0||val>100)
- {
- return false;
- }
- return true;
- }
- };
有了上面得定義后,我們就可以以函數(shù)調(diào)用的形式使用上面的函數(shù)對象了,如: for_each(vectorA.begin(),vectorA.end(),print)打印大于等于0小于等于100的數(shù), transform(vectorA.begin(),vectorA.end(),vectorB.begin(),isOk())判斷向量vectorA中值x的范圍是否在0之100之間。
如果在則向量vectorB對應(yīng)的值為真,否則為假,其中vectorB中的數(shù)據(jù)類型為bool。在實際中往往會根據(jù)調(diào)用函數(shù)對象時參數(shù)的多少將函數(shù)對象分為三種形式,,無參函數(shù)對象,一元函數(shù)對象和二元函數(shù)對象,剛才的C++函數(shù)對象就是一個無參函數(shù)對象。無參函數(shù)對象與一元,二元函數(shù)對象有很大的區(qū)別,一元,二元函數(shù)對象的定義需要繼承以下函數(shù)原型:
- class Grade
- {
- public:
- Grade(int id,string name,int score)
- {
- ID=id;
- Name=name;
- Score=score;
- }
- int ID;
- string Name;
- int Score;
- };
【編輯推薦】