C++中點(diǎn)操作符和箭頭操作符的使用詳解
區(qū)別
C++中對(duì)于類(lèi)來(lái)說(shuō),對(duì)于其中的成員,用點(diǎn)操作符.來(lái)獲得,
而對(duì)于一個(gè)指向類(lèi)對(duì)象的指針來(lái)說(shuō),則用箭頭操作符->調(diào)用該指針?biāo)赶驅(qū)ο蟮某蓡T。
當(dāng)類(lèi)定義->重載操作符后,則既可以用箭頭操作符,也可以用點(diǎn)操作符。
重載->操作符
重載箭頭操作符必須定義為類(lèi)成員函數(shù)。沒(méi)有顯式形參(而且是類(lèi)成員,唯一隱式形參是this)。->的右操作數(shù)不是表達(dá)式,而是對(duì)應(yīng)類(lèi)成員的一個(gè)標(biāo)識(shí)符,由編譯器處理獲取成員工作。
重載箭頭操作符必須返回指向類(lèi)類(lèi)型的指針,或者返回定義了自己的箭頭操作符的類(lèi)類(lèi)型對(duì)象。
如果返回類(lèi)型是指針,則內(nèi)置箭頭操作符可用于該指針,編譯器對(duì)該指針解引用并從結(jié)果對(duì)象獲取指定成員。如果被指向的類(lèi)型沒(méi)有定義那個(gè)成員,則編譯器產(chǎn)生一個(gè)錯(cuò)誤。
如果返回類(lèi)型是類(lèi)類(lèi)型的其他對(duì)象(或是這種對(duì)象的引用),則將遞歸應(yīng)用該操作符。編譯器檢查返回對(duì)象所屬類(lèi)型是否具有成員箭頭,如果有,就應(yīng)用那個(gè)操作符;否則,編譯器產(chǎn)生一個(gè)錯(cuò)誤。這個(gè)過(guò)程繼續(xù)下去,直到返回一個(gè)指向帶有指定成員的的對(duì)象的指針,或者返回某些其他值,在后一種情況下,代碼出錯(cuò)。
代碼分析:
下面給出代碼,加深理解。
#include <iostream>
using namespace std;
class A{
public:
void action()
{
cout<<"action in class A!"<<endl;
}
};
class B{
//A a;
public:
A a;
A* operator->(){
return &a;
}
void action(){
cout << "Action in class B!" << endl;
}
};
class C{
public:
B operator->(){
return b;
}
void action(){
cout << "Action in class C!" << endl;
}
};
int main()
{
C* pc = new C;
pc->action();
C c;
c->action();
return 0;
}
上面代碼輸出結(jié)果是:
Action in class C!
Action in class A!
對(duì)于代碼
C* pc = new C;
pc->action();
輸出的結(jié)果是:Action in class C!
這是因?yàn)閜c是類(lèi)對(duì)象指針,此時(shí)的箭頭操作符使用的是內(nèi)置含義,對(duì)pc解引用然后調(diào)用對(duì)象的成員函數(shù)action。
對(duì)于代碼:
C c;
c->action();
可以這樣理解:
c是對(duì)象,c后面的箭頭操作符使用的是重載箭頭操作符,即調(diào)用類(lèi)C的operator->()成員函數(shù)。此時(shí)返回的是類(lèi)B的對(duì)象,所以調(diào)用類(lèi)B的operator->()成員函數(shù),B的operator->()返回的是指針,所以現(xiàn)在可以使用內(nèi)置箭頭操作符了。對(duì)B的operator->()返回的指針進(jìn)行解引用,然后調(diào)用解引用后的對(duì)象的成員函數(shù)action,此時(shí)調(diào)用的就是類(lèi)A的action()。這里存在一個(gè)遞歸調(diào)用operator->()的過(guò)程,最后再使用一次內(nèi)置含義的箭頭操作符。
相關(guān)文章
VC++實(shí)現(xiàn)通過(guò)API來(lái)查看程序錯(cuò)誤信息的方法
這篇文章主要介紹了VC++實(shí)現(xiàn)通過(guò)API來(lái)查看程序錯(cuò)誤信息的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08c#中實(shí)現(xiàn)退出程序后自動(dòng)重新啟動(dòng)程序的方法
下面小編就為大家?guī)?lái)一篇c#中實(shí)現(xiàn)退出程序后自動(dòng)重新啟動(dòng)程序的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01整型數(shù)據(jù)在內(nèi)存中存儲(chǔ)方式的講解
今天小編就為大家分享一篇關(guān)于整型數(shù)據(jù)在內(nèi)存中存儲(chǔ)方式的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02C語(yǔ)言簡(jiǎn)明講解快速排序的應(yīng)用
快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用,再加上快速排序思想----分治法也確實(shí)實(shí)用,因此很多軟件公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個(gè),還有大大小的程序方面的考試如軟考,考研中也常常出現(xiàn)快速排序的身影2022-05-05詳解C++中對(duì)構(gòu)造函數(shù)和賦值運(yùn)算符的復(fù)制和移動(dòng)操作
這篇文章主要介紹了C++中對(duì)構(gòu)造函數(shù)和賦值運(yùn)算符的復(fù)制和移動(dòng),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01