• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            指向函數(shù)的指針的一點(diǎn)理解

            準(zhǔn)確地講,本文所涉及的內(nèi)容是C++中較難理解的,本文的目的不是在于將它們解釋清楚,因?yàn)檫@需要你循序漸進(jìn)地做很多練習(xí)才可以。看下面一個(gè)例子:

            				int 
            				(*func(
            				bool 
            				real))(
            				int
            				, 
            				int
            				)
            		

            你覺得它的返回值是什么?

            這里就涉及到了如何理解指向函數(shù)的指針的問題了。一些來自C++教材的建議是從里向外解讀這個(gè)表達(dá)式,這里所謂的里面就是func(bool real),那么剩下的部分就是所謂的返回值了?有點(diǎn)生硬吧。下面就讓我們循序漸進(jìn)地看看如何理解更好?

            為什么會對這個(gè)表達(dá)式的返回值產(chǎn)生疑問?

            要解決問題通常需要找出問題所在,這里是基于這樣一種思維定勢,那就是我們通常習(xí)慣于這樣一種聲明變量的方式:

            int a;

            這里我們聲明a是一個(gè)int類型的變量。而對于返回值,我們通常也是采用類似的方式,如一個(gè)返回值為int類型的函數(shù)通常可以以下面的方式進(jìn)行聲明:

            int func([params]);

            因此我們慣性地認(rèn)為返回值就是最左側(cè)的一個(gè)類型名,雖然這通常是對的,但是針對上面的那個(gè)例子則顯得十分尷尬。

            讓我們看看一個(gè)指向函數(shù)的指針的聲明式:

            				int 
            				(*
            				pCompare)(
            				int
            				, 
            				int
            				);
            		

            這個(gè)指針的名字就是pCompare,令人奇怪的是pCompare并不是在整個(gè)聲明式的最右邊,類型也肯定不是int,而是一個(gè)復(fù)雜的表達(dá)式。讓我們用typedef來聲明就會發(fā)現(xiàn)typedef的使用也不太一樣。

            				typedef int 
            				(*
            				PF
            				)(
            				int
            				, 
            				int
            				);
            		

            我們發(fā)現(xiàn)跟慣用的typedef *** ???;的方式也截然不同,在上面這個(gè)typedef過后,整個(gè)表達(dá)式可以被簡化成:

            				PF pCompare;
            		

            現(xiàn)在我們似乎就一見如故了,現(xiàn)在的表達(dá)式看起來中規(guī)中矩,普通的聲明都是類型名加變量名完成聲明,而函數(shù)指針的聲明則是在一個(gè)表達(dá)式中一個(gè)固定的位置進(jìn)行聲明。

            ?

            				int 
            				(*
            				)(
            				int
            				, 
            				int
            				);
            		

            在上文中劃線的部分即為聲明的部分,也就是這點(diǎn)不同讓我們逐漸迷失了方向。

            現(xiàn)在讓我們寫一個(gè)返回指向函數(shù)的指針的函數(shù),也就是返回值是PF的函數(shù),這就像我們從返回int類型的變量到返回int類型值的函數(shù)一樣,因此使用以下方式即可:

            PF func([params]);

            現(xiàn)在讓我們擴(kuò)展PF,將它還原,也就是把右側(cè)的func([params])部分移到那個(gè)橫線的位置上。現(xiàn)在我們就可以很輕松地理解本文開頭的那個(gè)函數(shù),原來是返回值為int (*)(int, int)的函數(shù)

            				int 
            				(*func(
            				
            						bool 
            				
            				
            						real))(
            				int
            				, 
            				int
            				)
            		

            以上劃線的部分也就是一個(gè)函數(shù)扣除返回值的部分。也就等價(jià)于

            				PF 
            				func(
            				bool 
            				real)
            		

            至此你應(yīng)該能夠分析更加復(fù)雜的表達(dá)式了。

            下面的示例旨在幫助理解本文:

            /*
            ?*?main.cc
            ?*
            ?*??Created?on:?2009-2-1
            ?*??????Author:?Volnet
            ?
            */

            #include?
            < stdlib.h >
            #include?
            < iostream >
            using ?std::cout;
            using ?std::endl;

            int ?myCompare1(
            ????????
            int ?a,? int ?b,
            ????????
            int ?( * Compare)( int ,? int ));
            int ?realCompare( int ?a,? int ?b);
            int ?fakeCompare( int ?a,? int ?b);

            typedef?
            int ?( * PF)( int ,? int );
            int ?myCompare2(
            ????????
            int ?a,? int ?b,
            ????????PF?Compare);

            PF?getAPointerFunc1(
            bool ?real);
            int ?( * getAPointerFunc2( bool ?real))( int ,? int );

            int ?main( void ){
            ????
            int ?typeDeclared;
            ????typeDeclared?
            = ? 1 ;

            ????
            // PF?pCompare;
            ???? int ?( * pCompare)( int ,? int );

            ????
            if (pCompare? == ?NULL)
            ????????cout
            << " pCompare?==?NULL " << endl;
            ????
            else
            ????{
            ????????cout
            << " pCompare?!=?NULL " << " ?pComapre?=? " << pCompare << endl;
            ????}

            ????cout
            << " Compare?the?pointer?function. " << endl;
            ????cout
            << " The?compare?result?is?:? " <<
            ????????myCompare1(
            6 ,? 5 ,?realCompare) << endl;

            ????cout
            << " It's?the?same?to?invoke?realCompare?&?*realCompare?:? " <<
            ????????myCompare1(
            6 ,? 5 ,? * realCompare) << endl;

            ????cout
            << " Using?the?typedef?to?predigest?definition?:? " <<
            ????????myCompare2(
            8 ,? 7 ,?realCompare) << endl;

            ????cout
            << " Return?a?pointer?from?a?function?:? " <<
            ????????myCompare2(
            10 ,? 20 ,?getAPointerFunc1( true )) << endl;

            ????cout
            << " Return?a?pointer?from?a?function?:? " <<
            ????????myCompare2(
            20 ,? 30 ,?getAPointerFunc2( false )) << endl;

            ????
            return ?EXIT_SUCCESS;
            }

            int ?myCompare1(
            ????????
            int ?a,? int ?b,
            ????????
            int ?( * Compare)( int ,? int )){
            ????
            return ?Compare(a,?b);
            }
            int ?realCompare( int ?a,? int ?b){
            ????cout
            << " The?realCompare?has?be?invoked. " << endl;
            ????
            if (a? == ?b)
            ????????
            return ? 0 ;
            ????
            if (a? < ?b)
            ????????
            return ? - 1 ;
            ????
            else
            ????????
            return ? 1 ;
            }

            int ?fakeCompare( int ?a,? int ?b){
            ????cout
            << " The?fackCompare?has?be?invoked. " << endl;
            ????
            return ? 200 ;
            }

            int ?myCompare2(
            ????????
            int ?a,? int ?b,
            ????????PF?Compare){
            ????
            return ?Compare(a,?b);
            }

            PF?getAPointerFunc1(
            bool ?real){
            ????
            if (real)
            ????????
            return ?realCompare;
            ????
            else ? return ?fakeCompare;
            }

            int ?( * getAPointerFunc2( bool ?real))( int ,? int ){
            ????
            if (real)
            ????????
            return ?realCompare;
            ????
            else ? return ?fakeCompare;
            }

            ?


            伊人久久无码精品中文字幕| 国内精品综合久久久40p| 久久婷婷色综合一区二区| 国产午夜电影久久| 69久久精品无码一区二区| 欧洲精品久久久av无码电影| 久久人妻AV中文字幕| 亚洲国产成人精品91久久久| 久久天天躁狠狠躁夜夜2020| 日韩美女18网站久久精品| 久久国产香蕉一区精品| 久久久精品国产亚洲成人满18免费网站 | 国内精品久久久久久久97牛牛| 久久无码专区国产精品发布| 无码国内精品久久人妻麻豆按摩| 亚洲日本va午夜中文字幕久久 | 久久精品国产影库免费看| 久久99精品久久久久久久久久| 久久综合香蕉国产蜜臀AV| 99久久中文字幕| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久精品国产亚洲综合色| 久久久91精品国产一区二区三区 | 一本久道久久综合狠狠爱| 亚洲va久久久噜噜噜久久| 久久精品人人做人人爽电影蜜月| 狠狠狠色丁香婷婷综合久久俺| 精品久久人人妻人人做精品| 国内精品伊人久久久久妇| 国产三级久久久精品麻豆三级| 99久久国产综合精品网成人影院| 日本欧美国产精品第一页久久| 久久国产欧美日韩精品| 久久久久久噜噜精品免费直播| 伊人久久精品无码二区麻豆| 国产精品一久久香蕉国产线看 | 欧美久久天天综合香蕉伊| 欧美噜噜久久久XXX| 国产精品无码久久四虎| 亚洲AV日韩精品久久久久| 久久精品国产第一区二区|