類的成員變量指針和成員函數(shù)指針作為一種特殊的指針類型,在c++語法中有著特殊的使用方式和實(shí)現(xiàn)機(jī)制 這里有兩個基本要點(diǎn) *****1/成員變量指針本質(zhì)上就是在類的聲明中,變量在類中的相對地址. 2/成員函數(shù)既然是函數(shù),代表的就是一個地址,一個絕對地址* 那么我們可以做一個簡單的實(shí)驗(yàn)來探索這種機(jī)制:
/*main.cpp*/#include <iostream>#include <cstring>using namespace std;class Time{public: void showtime(void) const { cout << "時間 " << year << ',' << month << ',' << sec << endl; } Time (int year1,int month1,double sec1) : year(year1),month (month1),sec(sec1){ cout << "構(gòu)造函數(shù)" << endl; }public: int year; int month; double sec;};int main(){/*我們嘗試使用成員變量指針,并將變量的值打印出來*/int Time::*p_year = &Time::year;int Time::*p_month = &Time::month;double Time::*p_sec = &Time::sec;/*存儲成員變量的值 容器*/int copy = 0;memcpy(©,&p_year,sizeof(p_year));cout << copy << endl;memcpy(©,&p_month,sizeof(p_month));cout << copy << endl;memcpy(©,&p_sec,sizeof(p_sec));cout << copy << endl;/*探究成員函數(shù)*/void (Time::*p_show) (void) const = &Time::showtime;Time t1(2017,3,0.1), *p1 = &t1;Time t2(2017,3,0.2),*p2 = &t2;/*調(diào)用成員函數(shù)*/(t1.*p_show) ();(p1->*p_show) ();(t2.*p_show) ();(p2->*p_show) ();return 0;}/*g++ main.cpp./a.out 運(yùn)行輸出:048構(gòu)造函數(shù)構(gòu)造函數(shù)時間 2017,3,0.1時間 2017,3,0.1時間 2017,3,0.2時間 2017,3,0.2那么結(jié)果就很明顯了,成員變量year month sec相對Time類聲明相對地址依次是 0(首地址), (隔著一個int)4,(隔著兩個int)8,對于c++編譯器來說使用成員變量指針就會通過某一個對象的首地址通過和這個相對地址相加,計算出變量的絕對地址成員函數(shù)既然是絕對地址,為什么需要使用這種另類的聲明方法呢?和C語言一樣直接聲明一個函數(shù)指針,調(diào)用的時候傳遞參數(shù)不就ok了嗎?這個實(shí)際上比較簡單,因?yàn)閠his指針啊,C++類中實(shí)現(xiàn)的非靜態(tài)成員函數(shù)是有一個隱含的參數(shù)(形參this 類類型 *),所以使用成員函數(shù)的聲明形式就是為了這個this指針.*/新聞熱點(diǎn)
疑難解答
圖片精選