亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中的函數(shù)指針與函數(shù)對象的總結(jié)

 更新時間:2013年07月17日 10:49:28   作者:  
以下是對C++中的函數(shù)指針與函數(shù)對象的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下

篇一、函數(shù)指針
函數(shù)指針:
是指向函數(shù)的指針變量,在C編譯時,每一個函數(shù)都有一個入口地址,那么這個指向這個函數(shù)的函數(shù)指針便指向這個地址。

函數(shù)指針的用途是很大的,主要有兩個作用:用作調(diào)用函數(shù)和做函數(shù)的參數(shù)。

函數(shù)指針的聲明方法:
數(shù)據(jù)類型標(biāo)志符 (指針變量名) (形參列表);
一般函數(shù)的聲明為:
int func ( int x );
而一個函數(shù)指針的聲明方法為:
int (*func) (int x);
前面的那個(*func)中括號是必要的,這會告訴編譯器我們聲明的是函數(shù)指針而不是聲明一個具有返回型為指針的函數(shù),后面的形參要視這個函數(shù)指針?biāo)赶虻暮瘮?shù)形參而定。
然而這樣聲明我們有時覺得非常繁瑣,于是typedef可以派上用場了,我們也可以這樣聲明:
typedef int (*PF) (int x);
PF pf;
這樣pf便是一個函數(shù)指針,方便了許多。當(dāng)要使用函數(shù)指針來調(diào)用函數(shù)時,func(x)或者  (*fucn)(x) 就可以了,當(dāng)然,函數(shù)指針也可以指向被重載的函數(shù),編譯器會為我們區(qū)分這些重載的函數(shù)從而使函數(shù)指針指向正確的函數(shù)。
例子:

復(fù)制代碼 代碼如下:

typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{
    cout<<"bar "<<ch<<' '<<i<<endl;
    return ;
}
PFT pft;
pft = bar;
pft('e',91);

例子中函數(shù)指針pft指向了一個已經(jīng)聲明的函數(shù)bar(),然后通過pft來實現(xiàn)輸出字符和整型的目的。
函數(shù)指針另一個作用便是作為函數(shù)的參數(shù),我們可以在一個函數(shù)的形參列表中傳入一個函數(shù)指針,然后便可以在這個函數(shù)中使用這個函數(shù)指針?biāo)赶虻暮瘮?shù),這樣便可以使程序變得更加清晰和簡潔,而且這種用途技巧可以幫助我們解決很多棘手的問題,使用很小的代價就可獲得足夠大的利益(速度+復(fù)雜度)。
復(fù)制代碼 代碼如下:

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);

上述例子我們首先利用一個函數(shù)指針pft指向bar(),然后在foo()函數(shù)中使用pft指針來調(diào)用bar(),實現(xiàn)目的。將這個特點稍加利用,我們就可以構(gòu)造出強(qiáng)大的程序,只需要同樣的foo函數(shù)便可以實現(xiàn)對不同bar函數(shù)的調(diào)用。

篇二、函數(shù)對象
前面是函數(shù)指針的應(yīng)用,從一般的函數(shù)回調(diào)意義上來說,函數(shù)對象和函數(shù)指針是相同的,但是函數(shù)對象卻具有許多函數(shù)指針不具有的有點,函數(shù)對象使程序設(shè)計更加靈活,而且能夠?qū)崿F(xiàn)函數(shù)的內(nèi)聯(lián)(inline)調(diào)用,使整個程序?qū)崿F(xiàn)性能加速。

函數(shù)對象:這里已經(jīng)說明了這是一個對象,而且實際上只是這個對象具有的函數(shù)的某些功能,我們才稱之為函數(shù)對象,意義很貼切,如果一個對象具有了某個函數(shù)的功能,我們變可以稱之為函數(shù)對象。
如何使對象具有函數(shù)功能呢,很簡單,只需要為這個對象的操作符()進(jìn)行重載就可以了,如下:

復(fù)制代碼 代碼如下:

class A{
public:
int operator()(int x){return x;}
};
A a;
a(5);

這樣a就成為一個函數(shù)對象,當(dāng)我們執(zhí)行a(5)時,實際上就是利用了重載符號()。
函數(shù)對象既然是一個“類對象”,那么我們當(dāng)然可以在函數(shù)形參列表中調(diào)用它,它完全可以取代函數(shù)指針!如果說指針是C的標(biāo)志,類是C++特有的,那么我們也可以說指針函數(shù)和函數(shù)對象之間的關(guān)系也是同前者一樣的!(雖然有些嚴(yán)密)。當(dāng)我們想在形參列表中調(diào)用某個函數(shù)時,可以先聲明一個具有這種函數(shù)功能的函數(shù)對象,然后在形參中使用這個對象,他所作的功能和函數(shù)指針?biāo)鞯墓δ苁窍嗤?,而且更加安全?BR>下面是一個例子:
復(fù)制代碼 代碼如下:

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);

上述例子中首先定義了一個函數(shù)對象類,并重載了()操作符,目的是使前兩個參數(shù)相加并輸出,然后在addFunc中的形參列表中使用這個類對象,從而實現(xiàn)兩數(shù)相加的功能。
如果運用泛型思維來考慮,可以定一個函數(shù)模板類,來實現(xiàn)一般類型的數(shù)據(jù)的相加:
復(fù)制代碼 代碼如下:

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中便廣泛的運用了這項技術(shù),詳細(xì)內(nèi)容可參見候捷大師的一些泛型技術(shù)的書籍,不要以為函數(shù)對象的頻繁調(diào)用會使程序性能大大折扣,大量事實和實驗證明,正確使用函數(shù)對象的程序要比其他程序性能快很多!所以掌握并熟練運用函數(shù)對象才能為我們的程序加分,否則.......
如此看來,函數(shù)對象又為C++敞開了一道天窗,但隨之而來的便是一些復(fù)雜的問題和陷阱,如何去蔽揚利還需要我們不斷學(xué)習(xí)和探索。

相關(guān)文章

最新評論