我們知道 指向普通函數(shù)的指針,一般這么定義 :
數(shù)據(jù)類型名?(*?指針變量名)(參數(shù)列表)
void (*func)(int)
或者前面加一個? typedef?
typedef 數(shù)據(jù)類型名(*指針變量名)(參數(shù)列表)
typedef void (*funv) (int)
這兩種方式都可以,但是建議使用第二種方式:因為第二種方式相當(dāng)于給 函數(shù)指針定義了一個別名,能隱藏笨拙的語法構(gòu)造以及平臺一些相關(guān)的數(shù)據(jù)類型,可以使得代碼更美觀,可維護(hù)性、可移植性、可讀性更強(qiáng)。
實例:
如果不帶 typedef 關(guān)鍵字
//定義一個函數(shù) void tech(void) { printf("tech dreamer"); } void main() { //定義一個指針,指針的名字叫func,它可以指向一個函數(shù),并通過函數(shù)指針調(diào)用該函數(shù) void (*func)(); func = &tech; // 將func()函數(shù)的入口地址賦給指針變量pf,所以,pf就指向func()函數(shù) func(); //第一種調(diào)用方式,帶參數(shù)也可以 (*func)(); //第二種調(diào)用方式,帶參數(shù)也可以 }
2:對象成員函數(shù)函數(shù)指針定義增加 typedef 關(guān)鍵字?
void tech(void) { printf("tech dreamer"); } //命名一個類型,那么這個時候func不可以直接調(diào)用,而是一個類型了 typedef void (*func)(); void main() { //定義一個可調(diào)用的指針變量(函數(shù)):myfunc (這個是主要區(qū)別) func myfunc; myfunc = &tech; //將func()函數(shù)的入口地址賦給指針變量pf,所以,pf就指向func()函數(shù) myfunc(); //第一種調(diào)用方式,帶參數(shù)也可以 (*myfunc)(); //第二種調(diào)用方式,帶參數(shù)也可以 }
標(biāo)題1介紹了,普通函數(shù)函數(shù)指針的定義,對象成員函數(shù)指針定義情況相比要復(fù)雜一些。 那么復(fù)雜在哪里了?
首先成員函數(shù)和普通函數(shù)的根本區(qū)別是:成員函數(shù)是類中的一個成員,編譯系統(tǒng)要求在指針賦值語句中,指針變量的類型必須與賦值右側(cè)函數(shù)的類型相匹配,具體以下三個方面需匹配。
所以定義指向公用的 成員函數(shù)的指針變量操作步驟為:
1:定義形式:數(shù)據(jù)類型名 (類名::? ?*指針變量名)(參數(shù)列表)
2: 函數(shù)指針賦值: 指針變量名 = &類名::成員函數(shù)名
可以讓它指向一個公用成員函數(shù),只需要把公用成員函數(shù)的入口地址賦值給一個指向公用成員函數(shù)的指針變量即可。
3:函數(shù)調(diào)用:(對象名.*函數(shù)指針變量名)()
思考:這樣定義的函數(shù)指針變量,指向了一個類中的一個函數(shù)。但是,當(dāng)一個類實例化為多個對象的時候,到底要怎樣使用該函數(shù)指針?函數(shù)指針指向哪一個對象函數(shù),所以,我們在調(diào)用函數(shù)指針的時候,就必須指定哪一個對象??聪旅孢@個例子:
// main.cpp
#include#includeclass Student
{
public:
// 定義成員變量
char name[32];
char addr[32];
long number;
Student(char* pn, char* pa, long n) {
strcpy_s(name, pn);
strcpy_s(addr, pa);
number = n;
}
void print() {
std::cout<< "name = "<< name<< std::endl;
std::cout<< "addr = "<< addr<< std::endl;
std::cout<< "number = "<< number<< std::endl;
}
private:
};
// 定義Student類中的一個函數(shù)指針
void(Student::* pFunc)();
int main(void) {
std::string name = "xiaoming";
std::string addr = "wuhan";
Student stu((char*)name.c_str(),(char*)addr.c_str(), 123456789);
// 給函數(shù)指針賦值
pFunc = &Student::print;
// 通過函數(shù)指針調(diào)用成員函數(shù)(且必須指定具體類對象)
(stu.*pFunc)();
return 0;
}
// 打印結(jié)果
name = xiaoming
addr = wuhan
number = 123456789
這里有個知識點:大家可以好好體會。
對象的成員函數(shù)不是存放在對象的空間中的,而是存放在對象外的空間中。如果有多個同類的對象,他們公用同一個函數(shù)代碼段(類的成員函數(shù)),那么他們不是屬于某一個對象,而是屬于該類,由所有的類對象共享。因此,Student類中的 print()成員函數(shù),不是屬于stu對象的,而是屬于 Student類。所以,給指針變量 pFunc賦值的地址,應(yīng)該是Student類公用的函數(shù)代碼段的入口地址。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站題目:C++:函數(shù)指針進(jìn)階(二):指向?qū)ο蟪蓡T函數(shù)的指針-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://chinadenli.net/article30/ejgpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、建站公司、定制網(wǎng)站、Google、品牌網(wǎng)站設(shè)計、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容