C++對象指針—指向對象成員的指針


對象有地址,存放對象初始地址的指針變量就是指向對象的指針變量。對象中的成員也有地址,存放對象成員地址的指針變量就是指向對象成員的指針變量。

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;
使指針變量指向一個公用成員函數的一般形式為
   指針變量名=&類名::成員函數名;

例9.7 有關對象指針的使用方法。
#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指向t1.hour
   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函數
   void (Time::*p3)( ); //定義指向Time類公用成員函數的指針變量p3
   p3=&Time::get_time; //使p3指向Time類公用成員函數get_time
   (t1.*p3)( ); //調用對象t1中p3所指的成員函數(即t1.get_time( ))
}
程序運行結果為
10 (main函數第4行的輸出)
10:13:56 (main函數第5行的輸出)
10:13:56 (main函數第7行的輸出)
10:13:56 (main函數第10行的輸出)
可以看到為了輸出t1中hour,minute和sec的值,可以采用3種不同的方法。

幾點說明:
(1) 從main函數第9行可以看出: 成員函數的入口地址的正確寫法是: &類名::成員函數名。
(2) main函數第8、9兩行可以合寫為一行:
   void (Time::*p3)( )=&Time::get_time; //定義指針變量時指定其指向

 

出處:http://see.xidian.edu.cn/cpp/biancheng/view/200.html

////////////////////////eg2/////////////////////////////////

指向對象的指針

       在建立對象時,編譯系統會為每一個對象分配一定的存儲空間,以存放其成員。對象空間的起始地址就是對象指針。可以定義一個指針變量,用來存放對象的指針。

如果有一個類:

class Time

{public:

int hour;

int minute;

int sec;

void get_time;

};

void Time ::get_time()

{

cout<<hour<<”:”<<minute<<”:”<<sec<<endl;

}

在此基礎上有以下語句:

Time *pt;

Time t1;

pt = &t1;

這樣,pt就是指向Time類對象的指針變量,他只想對象t1。

定義指向類對象的指針變量的一般形式:

*pt             pt所指向的對象,即t1

(*pt).hour      pt所指向的對象中的hour成員,即t1.hour

pt->hour        pt所指向的對象中的hour成員,即t1.hour

(*pt).get_time()   調用pt所指向的對象中的get_time的函數,即t1.get_time

pt->get_time()  調用pt所指向的對象中的get_time的函數,即t1.get_time


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM