C++:函數(shù)指針進(jìn)階(二):指向?qū)ο蟪蓡T函數(shù)的指針-創(chuàng)新互聯(lián)

1:普通函數(shù)函數(shù)指針定義

我們知道 指向普通函數(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ù)也可以
}

增加 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ù)也可以
}
2:對(duì)象成員函數(shù)函數(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è)方面需匹配。

  1. 函數(shù)參數(shù)的類(lèi)型和參數(shù)的個(gè)數(shù)要匹配
  2. 函數(shù)返回值要匹配
  3. 函數(shù)所屬的類(lèi)要匹配

所以定義指向公用的 成員函數(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)

搜索引擎優(yōu)化