C++中的對(duì)象指針總結(jié)
指向?qū)ο蟮闹羔?BR>在建立對(duì)象的時(shí)候,變異系統(tǒng)會(huì)給每一個(gè)對(duì)象分配一定的存儲(chǔ)空間,以存放其成員。
對(duì)象空間的起始地址就是對(duì)象的指針??梢远x一個(gè)指針變量,用來(lái)存放對(duì)象的指針。
一個(gè)簡(jiǎn)單的示例1.1:
#include<iostream>
using namespace std;
class Student
{
public:
int num;
int score;
Student(int ,int );//聲明構(gòu)造函數(shù)
void Print();//聲明輸出信息函數(shù)
};
Student::Student(int n,int s)
{
num=n;
score=s;
}
void Student::Print(){
cout<<num<<"\t"<<score<<endl;
}
int main(){
Student stud(1,100);//實(shí)例化一個(gè)對(duì)象
Student *p=&stud;//定義一個(gè)指向?qū)ο蟮闹羔?,并使用?duì)象stud的地址初始化
cout<<"*p.num:"<<(*p).num<<endl;//使用指向?qū)ο蟮闹羔樥{(diào)用數(shù)據(jù)成員的方式一
cout<<"p->score:"<<p->score<<endl;//使用指向?qū)ο蟮闹羔樥{(diào)用數(shù)據(jù)成員的方式二
(*p).Print();
p->Print();
return 0;
}
指向?qū)ο蟪蓡T的指針
對(duì)象有地址,存放對(duì)象初始地址的指針變量就是指向?qū)ο蟮闹羔樧兞俊?BR>對(duì)象中的成員也有地址,存放對(duì)象成員地址的指針變量就是指向?qū)ο蟪蓡T的指針變量。
1.指向?qū)ο髷?shù)據(jù)成員的指針
定義指向?qū)ο髷?shù)據(jù)成員的方法和定義指向普通變量的方法相同:
數(shù)據(jù)類型 * 指針變量名
p=&t1.hour;//將對(duì)象t1的數(shù)據(jù)成員hour的地址賦給p,p指向t1.hour
cout<<*p<<endl;//輸出t1.hour的值
2.指向?qū)ο蟪蓡T函數(shù)的指針
定義指向成員函數(shù)的指針和定義指向普通函數(shù)的指針的方法是不同的。
定義指向普通函數(shù)的指針的方法是這樣的:
數(shù)據(jù)類型名(* 指針變量名)(參數(shù)列表);
如:
void (*p)(int n,int m);//p是指向void型函數(shù)的指針變量
p=fun;//將fun函數(shù)的入口地址賦給指針變量p,p就指向了函數(shù)fun
(*p)(a,b);//調(diào)用fun函數(shù),其中,a,b是實(shí)參
而定義一個(gè)指向?qū)ο蟪蓡T函數(shù)的指針變量則比較復(fù)雜一些。
如果我們直接按照上面的方法定義指針變量,將對(duì)象成員函數(shù)名賦給指針變量p:
void (*p)();
p=t1.Print();
編譯會(huì)出現(xiàn)錯(cuò)誤
成員函數(shù)與普通函數(shù)的一個(gè)最根本區(qū)別:它是類中的一個(gè)成員。
編譯系統(tǒng)要求上面的復(fù)制語(yǔ)句中,指針變量的類型必須與賦值號(hào)右側(cè)函數(shù)的類型相匹配,要求在一下3個(gè)方面要匹配:
1.函數(shù)參數(shù)的類型和參數(shù)個(gè)數(shù)
2.函數(shù)返回值的類型
3.所屬的類
前兩個(gè)是匹配的,而第三點(diǎn)不匹配。
指針變量p與類無(wú)關(guān),而Print()卻屬于Student類。
要定義指向成員函數(shù)的指針變量應(yīng)該采用以下形式:
void (Student::*p)();//定義p為指向Student類中公共成員函數(shù)的指針變量
數(shù)據(jù)類型名(類名::*指針變量名)(參數(shù)表列);
我們知道,所有的Student類實(shí)例化得到的對(duì)象都是公用一個(gè)成員函數(shù)的,所以我們沒(méi)有必要指定它是指向那個(gè)對(duì)象的成員函數(shù)的指針,我們只需要定義它是指向該類的成員函數(shù)就可以了。
使指針變量指向一個(gè)公用成員函數(shù)的一般形式為:
p=&Student::Print;
指針變量名=&類名::成員函數(shù)名;
在使用時(shí),仍然需要將指針?lè)诺骄唧w的對(duì)象中使用,(*p)的作用等價(jià)于Print()
stud.(*p);//作用與stud.Print()的作用等價(jià)
=================一個(gè)使用對(duì)象指針的例子1.2===========
#include<iostream>
using namespace std;
class Student
{
public:
int num;
int score;
Student(int ,int );
void Print();
};
Student::Student(int n,int s)
{
num=n;
score=s;
}
void Student::Print(){
cout<<num<<"\t"<<score<<endl;
}
int main(){
Student stud(1,100);
cout<<"stud.Print()"<<endl;
stud.Print();//直接調(diào)用對(duì)象stud的成員函數(shù)Print();
Student *p_class=&stud;//定義指向?qū)ο髎tud的指針;
cout<<"p_class->Print()"<<endl;
p_class->Print();//通過(guò)指向?qū)ο蟮闹羔樥{(diào)用成員函數(shù)Print();
void (Student::*p_fun)();//聲明p_fun是指向Student中的函數(shù)的指針
p_fun=&Student::Print;//是p_fun指向Student類公用成員函數(shù)Print()
cout<<"(stud.*p_fun)()"<<endl;
(stud.*p_fun)();//調(diào)用對(duì)象stud中的p_fun所指向的成員函數(shù)(即:stud.Print)
return 0;
}
this指針
每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占用存儲(chǔ)空間,如果對(duì)同一個(gè)類定義了n個(gè)對(duì)象,則有n組同樣大小的空間一存放n個(gè)對(duì)象中的數(shù)據(jù)成員。
單數(shù)不同的對(duì)象都調(diào)用同一段函數(shù)代碼段。
那么,當(dāng)不同對(duì)象的成員函數(shù)引用數(shù)據(jù)成員時(shí),怎么能保證引用的是所制定的對(duì)象的數(shù)據(jù)成員呢?
實(shí)際上,在每一個(gè)成員函數(shù)中,都包含一個(gè)特殊的指針,這個(gè)指針的名字是固定的,稱為this指針。
它是指向本類對(duì)象的指針,它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的起始地址。
例如:
Print()函數(shù)中
cout<<num<<"\t"<<score<<endl;
實(shí)際上是
cout<<this->num<<"\t"<<this->score<<endl;
this指針式隱式使用的,它是作為參數(shù)被傳遞給成員函數(shù)。
在程序中的函數(shù):
void Student::Print(){
cout<<num<<"\t"<<score<<endl;
}
C++編譯系統(tǒng)會(huì)自動(dòng)處理成:
void Student::Print(Student *this){
cout<<this->num<<"\t"<<this->score<<endl;
}
即在成員函數(shù)的形參表列中增加一個(gè)this指針。在調(diào)用成員函數(shù)stud.Print()時(shí),實(shí)際上是用以下方式調(diào)用的:
stud.Print(&stud);
上一篇:c++通過(guò)引用實(shí)現(xiàn)三個(gè)數(shù)字求最大值
欄 目:C語(yǔ)言
下一篇:C++輸出斐波那契數(shù)列的兩種實(shí)現(xiàn)方法
本文標(biāo)題:C++中的對(duì)象指針總結(jié)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3934.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法