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