類的成員變量指針和成員函數指針作為一種特殊的指針類型,在c++語法中有著特殊的使用方式和實現機制 這里有兩個基本要點 *****1/成員變量指針本質上就是在類的聲明中,變量在類中的相對地址. 2/成員函數既然是函數,代表的就是一個地址,一個絕對地址* 那么我們可以做一個簡單的實驗來探索這種機制:
/*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 << "構造函數" << 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;/*探究成員函數*/void (Time::*p_show) (void) const = &Time::showtime;Time t1(2017,3,0.1), *p1 = &t1;Time t2(2017,3,0.2),*p2 = &t2;/*調用成員函數*/(t1.*p_show) ();(p1->*p_show) ();(t2.*p_show) ();(p2->*p_show) ();return 0;}/*g++ main.cpp./a.out 運行輸出:048構造函數構造函數時間 2017,3,0.1時間 2017,3,0.1時間 2017,3,0.2時間 2017,3,0.2那么結果就很明顯了,成員變量year month sec相對Time類聲明相對地址依次是 0(首地址), (隔著一個int)4,(隔著兩個int)8,對于c++編譯器來說使用成員變量指針就會通過某一個對象的首地址通過和這個相對地址相加,計算出變量的絕對地址成員函數既然是絕對地址,為什么需要使用這種另類的聲明方法呢?和C語言一樣直接聲明一個函數指針,調用的時候傳遞參數不就ok了嗎?這個實際上比較簡單,因為this指針啊,C++類中實現的非靜態成員函數是有一個隱含的參數(形參this 類類型 *),所以使用成員函數的聲明形式就是為了這個this指針.*/新聞熱點
疑難解答
圖片精選