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