天天看點

指向對象成員的指針

指向對象成員的指針 對象有位址,存放對象初始位址的指針變量就是指向對象的指針變量。對象中的成員也有位址,存放對象成員位址的指針變量就是指向對象成員的指針變量。 1. 指向對象資料成員的指針 定義指向對象資料成員的指針變量的方法和定義指向普通變量的指針變量方法相同。例如 int *p1;                   // 定義指向整型資料的指針變量 定義指向對象資料成員的指針變量的一般形式為 資料類型名 * 指針變量名; 如果Time 類的資料成員hour 為公用的整型資料,則可以在類外通過指向對象資料成員的指針變量通路對象資料成員hour p1=&t1.hour;               // 将對象t1 的資料成員hour 的位址賦給p1 ,p1 指向t1.hour cout<<*p1<<endl;           // 輸出t1.hour 的值 2. 指向對象成員函數的指針 需要提醒讀者注意: 定義指向對象成員函數的指針變量的方法和定義指向普通函數的指針變量方法有所不同。 成員函數與普通函數有一個最根本的差別: 它是類中的一個成員。編譯系統要求在上面的指派語句中,指針變量的類型必須與指派号右側函數的類型相比對,要求在以下3 方面都要比對: ①函數參數的類型和參數個數;②函數傳回值的類型;③所屬的類。 定義指向成員函數的指針變量應該采用下面的形式: void (Time *p2)( );           // 定義p2 為指向Time 類中公用成員函數的指針變量 定義指向公用成員函數的指針變量的一般形式為 資料類型名 ( 類名∷* 指針變量名)( 參數表列) 可以讓它指向一個公用成員函數,隻需把公用成員函數的入口位址賦給一個指向公用成員函數的指針變量即可。如 p2=&Time get_time; 使指針變量指向一個公用成員函數的一般形式為 指針變量名=& 類名∷成員函數名; 例1. 有關對象指針的使用方法。 #include <iostream> using namespace std; class Time {public: Time(int,int,int); int hour; int minute; int sec; void get_time( );                // 聲明公有成員函數 }; Time Time(int h,int m,int s) {hour=h; minute=m; sec=s; } void Time get_time( )              // 定義公有成員函數 {cout<<hour<< : <<minute<< <<sec<<endl;} int main( ) {Time t1(10,13,56);               // 定義Time 類對象t1 int *p1=&t1.hour;         // 定義指向整型資料的指針變量p1 ,并使p1 cout<<*p1<<endl;                 // 輸出p1 所指的資料成員t1.hour t1.get_time( );                   // 調用對象t1 的成員函數get_time Time *p2=&t1;              // 定義指向Time 類對象的指針變量p2 ,并使p2 指向t1 p2->get_time( );                  // 調用p2 所指向對象( 即t1) 的get_time 函數 *p3)( );              // 類公用成員函數的指針變量p3 p3=&Time get_time;              // 使p3 指向Time 類公用成員函數get_time (t1.*p3)( );                   // 中p3 所指的成員函數( 即t1.get_time( )) 程式運作結果為 10                        (main 函數第4 行的輸出) 10:13:56                  (main 函數第5 函數第7 函數第10 可以看到為了輸出t1 中hour,minute 和sec 的值,可以采用3 種不同的方法。 說明: (1) 從main 函數第9 行可以看出: 成員函數的入口位址的正确寫法是: & 類名∷成員函數名。 (2) main 函數第8 、9 兩行可以合寫為一行: *p3)( )=&Time get_time;         // 定義指針變量時指定其指向

繼續閱讀