為了說明物件指標與物件引用的相關知識,我們來看一下下面的例子
在這個類中,我們定義了兩個資料成員(乙個橫座標乙個縱座標),另外,還定義了乙個建構函式,還有三個成員函式,其中printinfo()函式是乙個常成員函式。那麼在實現的時候,也需要在printinfo函式後面加上const關鍵字來修飾,如下:
下面我們來看看物件的引用和物件的指標如何來定以。
當我們例項化乙個物件coor1的時候,我們就可以給這個物件coor1起乙個別名叫做coor2(也就是定義乙個引用,引用的名字叫做coor2),當從coor2去呼叫printinfo()的時候,也會列印出coor1的座標(3, 5)來。同理,當我們去定義乙個物件的指標pcoor,如果讓它去指向coor1的話,那麼使用pcoor去呼叫printinfo()的時候,也會列印出coor1的座標(3, 5)。這裡需要提醒大家的是,如果我們定義的是物件的引用,我們就可以直接就用那個物件賦值給這個引用;但是當我們定義的是物件指標的時候,我們在給這個指標賦值的時候,一定特別注意給這個物件前面要加上取位址(&)符號,這樣才能正確的賦值。說完了物件引用和物件指標後,如果我們在定義的時候,在前面加上const修飾符,這就變成了物件的常引用和常指標了。
在這個例子當中,我們定義了乙個物件的常引用和物件的常指標,當用coor1去呼叫printinfo()的時候,肯定不會有問題,會列印出coor1的座標(3, 5)。關鍵是當我們用coor2去呼叫getx()的時候,因為getx這個時候還會傳入乙個this指標,而這個this指標就是coor2這樣的this指標。請注意我們在定義getx和gety的時候,沒有在其後面加const,也就是說getx和gety並不是乙個常成員函式,這就意味著當用coor2去呼叫getx()的時候就會出現錯誤,而出現錯誤的原因就是因為此時coor2是乙個常引用,作為常引用來說,它只有讀許可權,而getx這裡的引數this是乙個要求讀/寫許可權的引數,所以其傳入的時候就會出現編譯錯誤。所以此時,coor2只能呼叫其常成員函式。同理使用pcoor來呼叫gety的時候也是錯誤的,因為pcoor此時是乙個常指標(也只有唯讀許可權)。
下面繼續看乙個更為複雜的例子。
在這個例子中,例項化了兩個座標物件coor1和coor2,然後又定義了乙個物件指標,注意,這裡定義的物件指標跟剛剛前面定以的有點不一樣。之前const的位置是在coordinate的前面,現在const放在了*的後面。如果放在*的後面,我們定義的這個pcoor一旦指向了乙個物件,那麼它就不能再指向另外的物件了。那麼我們繼續分析下面的三行**,看看是不是正確。
當pcoor去呼叫gety,而gety這裡要求傳入的是可讀寫許可權的物件,而pcoor雖然用const修飾了,但是它的修飾位置是修飾的其本身(意味著這個指標不能指向其他物件),但是這個指標所指向的物件的內容本身是可變的,可見它是乙個具有讀寫許可權的指標,只限於它所指向的那個物件可讀寫,但是它卻不能指向其他物件。所以這行**是正確的。再看下面一行**,pcoor去指向了coor2,這個就是不允許的(因為pcoor不可以再指向其他物件了),顯然這裡編譯器就會報錯。對於第三行**,pcoor去呼叫printinfo,顯然也是正確的,因為printinfo是乙個常成員函式(常成員函式這裡傳入的this指標要求的是唯讀許可權的),而此時的指標pcoor是具有可讀寫許可權的,所以顯然也是正確的。
指標與常成員常指標
指標的型別與其所指向的物件型別必須一致,例外就是允許令乙個指向常量的指標指向非常量物件 double dval 3.14 const double cptr cptr dval 總結,常指標可以指向常量或變數,但常量就只能用常指標來指向。int const cur err 代表指標cur是常指標只能...
c 中的常量,常物件,常引用,常指標
所謂常量是指在程式執行中值始終不可改變的量。而常物件是指他的資料成員在物件的整個生存週期內不能改變。這也意味著不能用常物件去呼叫普通的成員函式,因為有可能會改變常物件的資料成員,所以便有了常成員函式。如果乙個物件被宣告為常物件,他只能呼叫常成員函式。普通物件也能呼叫常成員函式,但是會被視為常物件,即...
常指標 常引用作為形參和返回值
include using namespace std const int n 10 intsum1 const int p return sum void sum2 const int p,int s 常量指標,普通指標,無返回 const int sum3 const int p,int s 指...