C++指向類成員的指針詳解
序言:在C++中,可以定義一個指針,使其指向類成員函數(shù)或或成員函數(shù),然后通過指針來訪問類的成員,這包括指向?qū)傩猿蓡T的指針和指向成員函數(shù)的指針。
一.指向普通變量和函數(shù)的指針
指向普通變量的指針
int a=100; int *p = &a;
指向函數(shù)的指針(即函數(shù)指針)
int(*p)(int, int);
這條語句的理解:定義了一個指向函數(shù)的指針變量p,首先它是一個指針變量(*p),其次前面的int表示指針變量可以指向返回類型為int型的函數(shù),后面括號中的兩個int表示這個指針變量可以指向兩個參數(shù)都是int型的函數(shù)。所以合起來的意思就是:定義了一個指針變量p,該指針變量可以指向返回值類型為int型,且有兩個整形參數(shù)的函數(shù),p的類型為int(*)(int, int)
函數(shù)指針的定義方式為:
函數(shù)返回值類型 (* 指針變量名) (函數(shù)參數(shù)列表);
示例
int Func(int x); /*聲明一個函數(shù)*/ int (*p) (int x); /*定義一個函數(shù)指針*/ p = Func; /*將Func函數(shù)的首地址賦給指針變量p*/
二.指向類成員的指針
1.指向類數(shù)據(jù)成員的指針
//定義和賦值(和類相關(guān)) 數(shù)據(jù)類型 類名:: *指針名 = &類名::成員名 //使用(和對象相關(guān)) //由于類不是運行時 存在的對象。因此,在使用這類指針時,需要首先指定類的一個對象,然后,通過對象來引用指針?biāo)赶虻某蓡T。 類對象名.*指向非靜態(tài)數(shù)據(jù)成員的指針 類對象指針->*指向非靜態(tài)數(shù)據(jù)成員的指針
2.指向類成員函數(shù)的指針
//定義和賦值(和類相關(guān)) 函數(shù)返回類型名 (類名::*函數(shù)指針名)(參數(shù)列表) = &類名::成員函數(shù)名 //使用(和對象相關(guān)) //由于類不是運行時存在的對象。因此,在使用這類指針時,需要首先指定類的一個對象,然后,通過對象來引用指針?biāo)赶虻某蓡T。 (類對象名.*指向非靜態(tài)成員函數(shù)的指針)(參數(shù)列表) (類對象指針->*指向非靜態(tài)成員函數(shù)的指針)(參數(shù)列表)
示例
class Stu { public: Stu(string sn,int ia): name(sn),age(ia) { } void print() { cout<<name<<"---"<<age<<endl; } public: string name; int age; }; int main() { int a=100; int *p = &a; Stu s1("zhang",14); Stu s2("lili",19); Stu * pp = new Stu("wojiushiwo",30); int Stu::*pa = &Stu::age; //pa是指向類成員變量age的指針變量 string Stu::*pb = &Stu::name; //pb是指向類成員變量name的指針變量 cout<<s1.name<<s2.name<<endl; //值:zhanglili cout<<s1.*pa<<"---"<<s1.*pb<<endl; //值: 14---zhang void (Stu::*fa)()=&Stu::print; //fa是指向類成員函數(shù)的函數(shù)指針 (s1.*fa)(); //值:zhang---14 (s2.*fa)(); //值:lili---19 (pp->*fa)(); //值:wojiushiwo---30 return 0; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語言實現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用椎棧
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用椎棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11C++開發(fā)之PugiXML庫基礎(chǔ)用法示例詳解
PugiXML庫是一個功能強大、簡單易用的C++ XML解析庫,它提供了一組方便的函數(shù)來解析、創(chuàng)建和修改XML文檔,本文介紹了如何使用PugiXML庫來解析、創(chuàng)建和修改XML文檔,以及如何處理錯誤和異常,感興趣的朋友跟隨小編一起看看吧2024-03-03codeblocks 對‘cv::waitKey(int)’未定義的引用方式
今天小編就為大家分享一篇codeblocks 對‘cv::waitKey(int)’未定義的引用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12VS2022+libtorch+Cuda11.3安裝測試教程詳解(調(diào)用cuda)
這篇文章主要介紹了VS2022+libtorch+Cuda11.3安裝測試(調(diào)用cuda),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05C++實現(xiàn)LeetCode(137.單獨的數(shù)字之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(137.單獨的數(shù)字之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07