指向类的数据成员和函数指针
指向類成員的指針
在C++語言中,可以定義一個指針,使其指向類成員或成員函數(shù),然后通過指針來訪問類的成員。這包括指向?qū)傩猿蓡T的指針和指向成員函數(shù)的指針。
à 指向數(shù)據(jù)成員的指針
在C++語言中,可以定義一個指針,使其指向類成員。當(dāng)屬性成員為靜態(tài)和非靜態(tài)時,指針的使用也有不同。其中,指向非靜態(tài)數(shù)據(jù)成員的指針定義格式如下:
1.??? <數(shù)據(jù)類型> <類名>::*<指針名> [ = &<類名>::<非靜態(tài)數(shù)據(jù)成員>]?指向非靜態(tài)數(shù)據(jù)成員的指針在定義時必須和類相關(guān)聯(lián),在使用時必須和具體的對象關(guān)聯(lián)。
2.??? <類對象名>.*<指向非靜態(tài)數(shù)據(jù)成員的指針>?指向靜態(tài)數(shù)據(jù)成員的指針的定義和使用與普通指針相同,在定義時無須和類相關(guān)聯(lián),在使用時也無須和具體的對象相關(guān)聯(lián)。
假設(shè)已經(jīng)定義了一個類student,該類有非靜態(tài)成員math,靜態(tài)成員chinese,代碼演示了指向它們的指針定義方式。
1.?????????? student?s1; ? 2.?????????? int?student::*pm=&student::math;????//指向非靜態(tài)屬性 ? 3.?????????? s1.*pm=100;?????????????????????????//設(shè)置非靜態(tài)屬性 ? 4.?????????? int?*pc=&student::chinese;??????????//指向靜態(tài)屬性 ? 5.?????????? *pc=10;?????????????????????????????//設(shè)置靜態(tài)屬性?分析:該示例定義了指針pc和pm,分別指向類的靜態(tài)數(shù)據(jù)成員chinese和非靜態(tài)數(shù)據(jù)成員math。訪問pm時,必須使用類實例來修飾。而訪問pc時,與普通指針沒有區(qū)別。
à 指向成員函數(shù)的指針
定義一個指向非靜態(tài)成員函數(shù)的指針必須在三個方面與其指向的成員函數(shù)保持一致:參數(shù)列表要相同、返回類型要相同、所屬的類型要相同。定義格式如下:
1.??? <數(shù)據(jù)類型>(<類名>::*<指針名>)(<參數(shù)列表>)[=&<類名>::<非靜態(tài)成員函數(shù)>]?使用指向非靜態(tài)成員函數(shù)的指針的方法和使用指向非靜態(tài)數(shù)據(jù)成員的指針的方法相同,格式如下:
2.??? (<類對象名>.*<指向非靜態(tài)成員函數(shù)的指針>)(<參數(shù)列表>);?指向靜態(tài)成員函數(shù)的指針和普通指針相同,在定義時無須和類相關(guān)聯(lián),在使用時也無須和具體的對象相關(guān)聯(lián)。
3.??? <數(shù)據(jù)類型>(*<指針名>)(<參數(shù)列表>)[=&<類名>::<靜態(tài)成員函數(shù)>]?假設(shè)類student有非靜態(tài)成員函數(shù)f1,非靜態(tài)成員函數(shù)f2,代碼演示指向它們的函數(shù)指針的定義方式。
1.?????????? student?s1; ? 2.?????????? float?(student::*pf1)()=&student::f1;???????//指向非靜態(tài)成員函數(shù)的指針 ? 3.?????????? (s1.*pf1)();?????????????????//調(diào)用指向非靜態(tài)成員函數(shù)的指針 ? 4.?????????? void?(*pf2)()=&student::f2;??//指向靜態(tài)成員函數(shù)的指針 ? 5.?????????? pf2();???????????????????????//調(diào)用靜態(tài)成員函數(shù)?分析:指向非靜態(tài)成員函數(shù)時,必須用類名作限定符,使用時則必須用類的實例作限定符。指向靜態(tài)成員函數(shù)時,則不需要使用類名作限定符。
?
分析:
?
pointName = &ClassName::member;
即將類中指定成員的地址賦給指針變量,其中ClassName是已定義的類名,而member是數(shù)據(jù)成員名。顯然,編譯系統(tǒng)對類名并不分配存儲空間,也就沒有一個絕對地址。所以這種賦值,是取該成員相對于該類的所在對象中的偏移量,即相對地址(距離開始位置的字節(jié)數(shù))。對類中的任一成員,其偏移量是一個常數(shù)。
?
因這種指針變量的值是一個相對地址,不是指向某一個對象中的數(shù)據(jù)成員的絕對地址,所以不能單獨使用這種指針變量來訪問數(shù)據(jù)成員。如*pointName 是不允許的。由于這種指針變量并不是類的成員,所以使用它只能訪問對象的公有數(shù)據(jù)成員。若要訪問對象的私有數(shù)據(jù)成員,必須通過成員函數(shù)來實現(xiàn)。
實例如下:
[cpp] view plaincopyprint?轉(zhuǎn)載于:https://www.cnblogs.com/hualimengyu/p/3766104.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的指向类的数据成员和函数指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB 4.6.1 c++ dr
- 下一篇: 易用性问题回复