欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

函數(shù)指針的聲明方法:
數(shù)據(jù)類型標(biāo)志符 (指針變量名) (形參列表);
一般函數(shù)的聲明為:
int func ( int x );
而一個(gè)函數(shù)指針的聲明方法為:
int (*func) (int x);
前面的那個(gè)(*func)中括號(hào)是必要的,這會(huì)告訴編譯器我們聲明的是函數(shù)指針而不是聲明一個(gè)具有返回型為指針的函數(shù),后面的形參要視這個(gè)函數(shù)指針?biāo)赶虻暮瘮?shù)形參而定。
然而這樣聲明我們有時(shí)覺得非常繁瑣,于是typedef可以派上用場(chǎng)了,我們也可以這樣聲明:
typedef int (*PF) (int x);
PF pf;
這樣pf便是一個(gè)函數(shù)指針,方便了許多。當(dāng)要使用函數(shù)指針來調(diào)用函數(shù)時(shí),func(x)或者  (*fucn)(x) 就可以了,當(dāng)然,函數(shù)指針也可以指向被重載的函數(shù),編譯器會(huì)為我們區(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指向了一個(gè)已經(jīng)聲明的函數(shù)bar(),然后通過pft來實(shí)現(xiàn)輸出字符和整型的目的。
函數(shù)指針另一個(gè)作用便是作為函數(shù)的參數(shù),我們可以在一個(gè)函數(shù)的形參列表中傳入一個(gè)函數(shù)指針,然后便可以在這個(gè)函數(shù)中使用這個(gè)函數(shù)指針?biāo)赶虻暮瘮?shù),這樣便可以使程序變得更加清晰和簡(jiǎn)潔,而且這種用途技巧可以幫助我們解決很多棘手的問題,使用很小的代價(jià)就可獲得足夠大的利益(速度+復(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);

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

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

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

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

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

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

上述例子中首先定義了一個(gè)函數(shù)對(duì)象類,并重載了()操作符,目的是使前兩個(gè)參數(shù)相加并輸出,然后在addFunc中的形參列表中使用這個(gè)類對(duì)象,從而實(shí)現(xiàn)兩數(shù)相加的功能。
如果運(yùn)用泛型思維來考慮,可以定一個(gè)函數(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中便廣泛的運(yùn)用了這項(xiàng)技術(shù),詳細(xì)內(nèi)容可參見候捷大師的一些泛型技術(shù)的書籍,不要以為函數(shù)對(duì)象的頻繁調(diào)用會(huì)使程序性能大大折扣,大量事實(shí)和實(shí)驗(yàn)證明,正確使用函數(shù)對(duì)象的程序要比其他程序性能快很多!所以掌握并熟練運(yùn)用函數(shù)對(duì)象才能為我們的程序加分,否則.......
如此看來,函數(shù)對(duì)象又為C++敞開了一道天窗,但隨之而來的便是一些復(fù)雜的問題和陷阱,如何去蔽揚(yáng)利還需要我們不斷學(xué)習(xí)和探索。

相關(guān)文章

最新評(píng)論