本篇內(nèi)容介紹了“C++指針怎么應(yīng)用”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)專注于善左企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都做商城網(wǎng)站。善左網(wǎng)站建設(shè)公司,為善左等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
成員函數(shù)指針的聲明
一個(gè)成員函數(shù)指針包括成員函數(shù)的返回類型,后隨::操作符類名,指針名和函數(shù)的參數(shù)。初看上去,語法有點(diǎn)復(fù)雜。其實(shí)可以把它理解為一個(gè)指向原函數(shù)的指針,格式是:函數(shù)返回類型,類名,::操作符,指針星號,指針名,函數(shù)參數(shù)。
一個(gè)指向外部函數(shù)的指針聲明為:
void (*pf)(char *, const char *); void strcpy(char * dest, const char * source); pf=strcpy;
一個(gè)指向類A成員函數(shù)的指針聲明為:
void (A::*pmf)(char *, const char *);
聲明的解釋是:pmf是一個(gè)指向A成員函數(shù)的指針,返回?zé)o類型值,函數(shù)帶有二個(gè)參數(shù),參數(shù)的類型分別是char * 和 const char *。除了在星號前增加A:: ,與聲明外部函數(shù)指針的方法一樣。
賦值
給成員指針賦值的方法是將函數(shù)名通過指針符號&賦予指針名。如下所示:
class A { public: void strcpy(char *, const char *); void strcat(char *, const char *); }; pmf = &A::strcpy;
有些老的編譯器可以通過沒有&號的賦值方式,但標(biāo)準(zhǔn)C++強(qiáng)制要求加上&號。
使用類型定義
可以用類型定義來隱藏復(fù)雜的成員指針語法。例如,下面的語句定義了PMA是一個(gè)指向A成員函數(shù)的指針,函數(shù)返回?zé)o類型值,函數(shù)參數(shù)類型為char * 和 const char *:
typedef void(A::*PMA)(char *, const char *); PMA pmf= &A::strcat; // pmf是PMF類型(類A成員指針)的變量
下文會看到使用類型定義特別有利于聲明成員指針數(shù)組。
通過成員指針調(diào)用成員函數(shù)
可以在不必知道函數(shù)名的情況下,通過成員指針調(diào)用對象的成員函數(shù)。例如,函數(shù)dispatcher有一個(gè)變量pmf,通過它調(diào)用類成員函數(shù),不管它調(diào)用的是strcpy()函數(shù)還是strcat()函數(shù)。指向外部原函數(shù)的指針和指向類成員函數(shù)的指針是有很大區(qū)別的。后者必須指向被調(diào)函數(shù)的宿主對象。因此,除了要有成員指針外,還要有合法對象或?qū)ο笾羔槨?/p>
現(xiàn)舉例做進(jìn)一步說明。假設(shè)A有二個(gè)實(shí)例,成員函數(shù)指針支持多態(tài)性。這樣在成員指針調(diào)用虛成員函數(shù)時(shí)是動態(tài)處理的(即所謂后聯(lián)編 - 譯注)。注意,不可調(diào)用構(gòu)造和析構(gòu)函數(shù)。示例如下:
A a1, a2; A *p= &a1; //創(chuàng)建指向A的指針 //創(chuàng)建指向成員的指針并初始化 void (A::*pmf)(char *, const char *) = &A::strcpy; //要將成員函數(shù)綁定到pmf,必須定義呼叫的對象。 //可以用*號引導(dǎo): void dispatcher(A a, void (A::*pmf)(char *, const char *)) { char str[4]; (a.*pmf)(str, “abc”); //將成員函數(shù)綁定到pmf } //或用A的指針表達(dá)方式指向成員指針: void dispatcher(A * p, void (A::*pmf)(char *, const char *)) { char str[4]; (p->*pmf)(str, “abc”); } //函數(shù)的調(diào)用方法為: dispatcher(a, pmf); // .* 方式 dispatcher(&a, pmf); // ->* 方式
高級使用技巧
以上是成員函數(shù)的基本知識?,F(xiàn)在介紹它的高級使用技巧。
成員指針數(shù)組
在下例,聲明了一個(gè)含有二個(gè)成員指針的數(shù)組,并分配類的成員函數(shù)地址給成員指針:
PMA pmf[2]= {&A::strcpy, &A::strcat};
這樣的數(shù)組在菜單驅(qū)動應(yīng)用中很有用。選擇菜單項(xiàng)后,應(yīng)用將調(diào)用相應(yīng)的回叫函數(shù),如下所示:
enum MENU_OPTIONS { COPY, CONCAT }; int main() { MENU_OPTIONS option; char str[4]; //從外部資源讀取選項(xiàng) switch (option) { case COPY: (pa->*pmf[COPY])(str, “abc”); break; case CONCAT: (pa->*pmf[CONCAT])(str, “abc”); break; //… } }
Const 類型的成員函數(shù)
成員指針的類型應(yīng)該與成員函數(shù)類型一致。上面例子中的pmf 可以指向A的任意函數(shù),只要該函數(shù)不是const類型。如下所示,如果將touppercase()的地址分配給pmf,將導(dǎo)致編譯出錯(cuò),因?yàn)閠ouppercase() 的類型是const。
Class A { public: void strpcy(char *, const char *); void strcat(char *, const char *); void touppercase(char *, const char*) const; }; pmf=&A::touppercase; //出錯(cuò),類型不匹配 //解決的方法是聲明一個(gè)const類型的成員指針: void (A::pcmf)(char *, const char *) const; pcmf=&A::touppercase; // 現(xiàn)在可以了
有些差勁的編譯器允許一個(gè)非const類型的成員指針指向const類型的成員函數(shù)。這在標(biāo)準(zhǔn)C++是不允許的。
“C++指針怎么應(yīng)用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
文章名稱:C++指針怎么應(yīng)用
標(biāo)題URL:http://chinadenli.net/article32/ieggsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、虛擬主機(jī)、App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、電子商務(wù)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)