C++中的函數指針與函數對象的總結。本站提示廣大學習愛好者:(C++中的函數指針與函數對象的總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中的函數指針與函數對象的總結正文
篇1、函數指針
函數指針:是指向函數的指針變量,在C編譯時,每個函數都有一個進口地址,那末這個指向這個函數的函數指針便指向這個地址。
函數指針的用處是很年夜的,重要有兩個感化:用作挪用函數和做函數的參數。
函數指針的聲明辦法:
數據類型標記符 (指針變量名) (形參列表);
普通函數的聲明為:
int func ( int x );
而一個函數指針的聲明辦法為:
int (*func) (int x);
後面的誰人(*func)中括號是需要的,這會告知編譯器我們聲明的是函數指針而不是聲明一個具有前往型為指針的函數,前面的形參要視這個函數指針所指向的函數形參而定。
但是如許聲明我們有時認為異常繁瑣,因而typedef可以派上用處了,我們也能夠如許聲明:
typedef int (*PF) (int x);
PF pf;
如許pf就是一個函數指針,便利了很多。當要應用函數指針來挪用函數時,func(x)或許 (*fucn)(x) 便可以了,固然,函數指針也能夠指向被重載的函數,編譯器會為我們辨別這些重載的函數從而使函數指針指向准確的函數。
例子:
typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{
cout<<"bar "<<ch<<' '<<i<<endl;
return ;
}
PFT pft;
pft = bar;
pft('e',91);
例子中函數指針pft指向了一個曾經聲明的函數bar(),然後經由過程pft來完成輸入字符和整型的目標。
函數指針另外一個感化就是作為函數的參數,我們可以在一個函數的形參列表中傳入一個函數指針,然後即可以在這個函數中應用這個函數指針所指向的函數,如許即可以使法式變得加倍清楚和簡練,並且這類用處技能可以贊助我們處理許多辣手的成績,應用很小的價值便可取得足夠年夜的好處(速度+龐雜度)。
typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{
cout<<"bar "<<ch<<' '<<i<<endl;
return ;
}
void foo(char ch, int i, PFT pf)
{
pf(ch,i);
return ;
}
PFT pft;
pft = bar;
foo('e',12,pft);
上述例子我們起首應用一個函數指針pft指向bar(),然後在foo()函數中應用pft指針來挪用bar(),完成目標。將這個特色略加應用,我們便可以結構出壯大的法式,只須要異樣的foo函數即可以完成對分歧bar函數的挪用。
篇2、函數對象
後面是函數指針的運用,從普通的函數回調意義下去說,函數對象和函數指針是雷同的,然則函數對象卻具有很多函數指針不具有的有點,函數對象使法式設計加倍靈巧,並且可以或許完成函數的內聯(inline)挪用,使全部法式完成機能加快。
函數對象:這裡曾經解釋了這是一個對象,並且現實上只是這個對象具有的函數的某些功效,我們才稱之為函數對象,意義很貼切,假如一個對象具有了某個函數的功效,我們變可以稱之為函數對象。
若何使對象具有函數功效呢,很簡略,只須要為這個對象的操作符()停止重載便可以了,以下:
class A{
public:
int operator()(int x){return x;}
};
A a;
a(5);
如許a就成為一個函數對象,當我們履行a(5)時,現實上就是應用了重載符號()。
函數對象既然是一個“類對象”,那末我們固然可以在函數形參列表中挪用它,它完整可以代替函數指針!假如說指針是C的標記,類是C++獨有的,那末我們也能夠說指針函數和函數對象之間的關系也是同前者一樣的!(固然有些周密)。當我們想在形參列表中挪用某個函數時,可以先聲明一個具有這類函數功效的函數對象,然後在形參中應用這個對象,他所作的功效和函數指針所作的功效是雷同的,並且加倍平安。
上面是一個例子:
class Func{
public:
int operator() (int a, int b)
{
cout<<a<<'+'<<b<<'='<<a+b<<endl;
return a;
}
};
int addFunc(int a, int b, Func& func)
{
func(a,b);
return a;
}
Func func;
addFunc(1,3,func);
上述例子中起首界說了一個函數對象類,偏重載了()操作符,目標是使前兩個參數相加並輸入,然後在addFunc中的形參列表中應用這個類對象,從而完成兩數相加的功效。
假如應用泛型思想來斟酌,可以定一個函數模板類,來完成普通類型的數據的相加:
class FuncT{
public:
template<typename T>
T operator() (T t1, T t2)
{
cout<<t1<<'+'<<t2<<'='<<t1+t2<<endl;
return t1;
}
};
template <typename T>
T addFuncT(T t1, T t2, FuncT& funct)
{
funct(t1,t2);
return t1;
}
FuncT funct;
addFuncT(2,4,funct);
addFuncT(1.4,2.3,funct);
年夜名鼎鼎的STL中便普遍的應用了這項技巧,具體內容可拜見候捷年夜師的一些泛型技巧的書本,不要認為函數對象的頻仍挪用會使法式機能年夜年夜扣頭,年夜量現實和試驗證實,准確應用函數對象的法式要比其他法式機能快許多!所以控制並闇練應用函數對象能力為我們的法式加分,不然.......
如斯看來,函數對象又為C++關閉了一道天窗,但隨之而來的就是一些龐雜的成績和圈套,若何去蔽揚利還須要我們赓續進修和摸索。