常指針與常引用
對象的引用和對象的指針
為了說明對象指針與對象引用的相關知識,我們來看一下下面的例子

在這個類中,我們定義了兩個數據成員(一個橫坐標一個縱坐標),另外,還定義了一個構造函數,還有三個成員函數,其中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是具有可讀寫權限的,所以顯然也是正確的。
