亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中的函數指針與函數對象的總結

2020-01-26 15:59:20
字體:
來源:轉載
供稿:網友

篇一、函數指針
函數指針:
是指向函數的指針變量,在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函數的調用。

篇二、函數對象
前面是函數指針的應用,從一般的函數回調意義上來說,函數對象和函數指針是相同的,但是函數對象卻具有許多函數指針不具有的有點,函數對象使程序設計更加靈活,而且能夠實現函數的內聯(inline)調用,使整個程序實現性能加速。

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

復制代碼 代碼如下:

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

這樣a就成為一個函數對象,當我們執行a(5)時,實際上就是利用了重載符號()。
函數對象既然是一個“類對象”,那么我們當然可以在函數形參列表中調用它,它完全可以取代函數指針!如果說指針是C的標志,類是C++特有的,那么我們也可以說指針函數和函數對象之間的關系也是同前者一樣的?。m然有些嚴密)。當我們想在形參列表中調用某個函數時,可以先聲明一個具有這種函數功能的函數對象,然后在形參中使用這個對象,他所作的功能和函數指針所作的功能是相同的,而且更加安全。
下面是一個例子:
復制代碼 代碼如下:

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++敞開了一道天窗,但隨之而來的便是一些復雜的問題和陷阱,如何去蔽揚利還需要我們不斷學習和探索。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲图片欧美午夜| 欧美极品少妇全裸体| 日韩在线高清视频| 91在线观看免费| 欧美富婆性猛交| 国产精品精品视频一区二区三区| 欧美成人精品在线播放| 国产va免费精品高清在线观看| 色悠悠久久久久| 91免费精品国偷自产在线| 国产偷亚洲偷欧美偷精品| 欧美日在线观看| wwwwwwww亚洲| 日韩精品在线观看一区二区| 欧美激情精品久久久久久蜜臀| 日韩av色综合| 日韩一区二区三区xxxx| 欧美激情videoshd| 久久精品国产亚洲精品| 亚洲午夜未删减在线观看| 亚洲欧美日韩国产中文专区| 亚洲精品一区久久久久久| 欧美一级黑人aaaaaaa做受| 亚洲人成电影网站色…| 91国内免费在线视频| 一本色道久久88综合日韩精品| 中文字幕日韩欧美在线| 久久精品国产亚洲精品| 国产精自产拍久久久久久| 亚洲开心激情网| 欧美成人午夜激情在线| 亚洲美女黄色片| 欧美视频在线观看 亚洲欧| 福利一区福利二区微拍刺激| 欧美日韩国产成人高清视频| 欧美国产中文字幕| 人人澡人人澡人人看欧美| 国产精品久久久久7777婷婷| 国产精品一区二区三区久久久| 亚洲欧美中文日韩在线v日本| 亚洲综合中文字幕在线| 国产美女精品视频| 在线观看欧美日韩| 最近2019中文免费高清视频观看www99| 午夜精品三级视频福利| 欧美性极品xxxx做受| 91av视频导航| 91精品国产91久久久久久| 欧美成人免费va影院高清| 久久手机精品视频| 久久久久久久成人| 国产不卡在线观看| 日韩美女免费视频| 亚洲福利视频在线| 久久久久久久999精品视频| 国产日韩欧美日韩大片| 欧美贵妇videos办公室| 国产精品美女www| 欧美午夜精品久久久久久人妖| 欧美成人三级视频网站| 国内精品久久久久久中文字幕| 亚洲日本成人网| 91爱视频在线| 热久久99这里有精品| 亚洲国产精品字幕| 欧美日韩在线观看视频| 欧美性20hd另类| 亚洲国产中文字幕久久网| 亚洲另类图片色| 久久精品最新地址| 欧美国产精品人人做人人爱| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩国产麻豆| 国产精品精品久久久久久| 国产主播在线一区| 欧美猛少妇色xxxxx| 欧美成人午夜剧场免费观看| 久久久这里只有精品视频| 日韩视频中文字幕| 欧美激情在线狂野欧美精品| 欧美裸体男粗大视频在线观看| 亚洲欧美国产va在线影院| 国产91|九色| 全亚洲最色的网站在线观看| 亚洲新中文字幕| 欧美色xxxx| 中文字幕欧美日韩精品| 日本亚洲欧洲色α| 中文字幕不卡在线视频极品| 久久成人一区二区| 亚洲美女av网站| 欧美成人在线免费| 色妞色视频一区二区三区四区| 国产国语videosex另类| 国产成人av在线| 亚洲一区二区三区毛片| 97精品伊人久久久大香线蕉| 欧美黑人狂野猛交老妇| 亚洲国产97在线精品一区| 精品久久中文字幕| 草民午夜欧美限制a级福利片| 国产欧美日韩丝袜精品一区| 国产欧美亚洲精品| 亚洲免费视频网站| 日本国产欧美一区二区三区| 色妞在线综合亚洲欧美| 国产日韩精品视频| 成人午夜高潮视频| 国产成人精品视| 国产精品久久久久久久久久三级| 97香蕉超级碰碰久久免费的优势| 91手机视频在线观看| 神马久久桃色视频| 亚洲影院在线看| 国内精品小视频在线观看| 国产激情999| 福利视频导航一区| 91精品在线一区| 亚洲人成免费电影| 97精品一区二区视频在线观看| 久久久久久噜噜噜久久久精品| 久久久久久久国产精品| 亚洲精品国产精品国自产观看浪潮| 欧美性极品少妇精品网站| 大量国产精品视频| 国产精品99免视看9| 国模精品视频一区二区| 久久理论片午夜琪琪电影网| 国产精品久久久久久久久久久久| 国产综合久久久久久| 欧美xxxx14xxxxx性爽| 久久久国产精品亚洲一区| 欧美夫妻性生活视频| 亚洲天堂男人天堂女人天堂| 伦伦影院午夜日韩欧美限制| 亚洲欧美综合v| 欧美日韩在线免费观看| 国产精品久久久久久久电影| 亚洲精品第一国产综合精品| 日韩视频一区在线| 成人国产精品色哟哟| 亚洲男人第一av网站| 久久影视电视剧免费网站| 国产精品91视频| 亚洲精品av在线播放| 国产精品爽爽爽爽爽爽在线观看| 日韩av网站在线| 亚洲精品美女在线观看| 国产精品美女久久| 欧美午夜视频在线观看| 亚洲国产日韩欧美在线图片| 亚洲精品国精品久久99热一| 欧美国产日韩xxxxx| 亚洲国产欧美一区二区丝袜黑人| 蜜臀久久99精品久久久久久宅男| 日韩av在线网页| 久热99视频在线观看| 中文字幕日韩在线视频| 精品美女久久久久久免费| 欧美精品成人91久久久久久久| 欧美日韩中文在线观看| 欧美日韩aaaa| 日韩av在线资源| 国产成人在线一区二区|