“指向const對象的指針”和“const指針”

const是C++中引入的一個新的關鍵字,它爲C++編程帶來了很大的方便。指向const對象的指針和const指針是兩個名字很接近的概念,對於初學者來說非常容易搞混,這裏對它們進行區分。
  1、指向const對象的指針
  可以這樣理解指向const對象的指針:
  指向const對象的指針就是一個指針,不能通過它來修改它所指向的對象的值
  · 聲明方法:const int *p;
  const對象在初始化後是不允許對其值進行修改的,因此,我們不能用一個普通指針指向一個const對象,即下面的賦值會引起編譯錯誤:
  const int i = 1;
  int *p = &i;
  否則的話,我們就可以利用普通指針來修改一個const對象的值,那麼const也就毫無意義了。
  正確的方法是利用一個指向const對象的指針來獲取const對象的地址:
  const int i = 1;
  const int *p = &i;
   這樣,利用指向const對象的指針也是不能修改它所指向的const對象的值的。
  需要注意的兩點:
  指向const對象的指針本身不是const類型(這也是它與const指針的主要不同點),所以它可以指向另一個const對象
  指向const對象的指針可以被賦予一個非const對象的地址,但是此時試圖通過此指針來修改對象的值的操作是非法的
  2. const指針
  可以這樣理解const指針:
  const指針就是一個指針,它本身就是const類型,所以將它初始化後不能再改變它的指向,即不能讓它指向一個新的對象
  聲明方法:
  int *const p;//指向非const對象的const指針
  const int *constp;//指向const對象的const指針
  由以上聲明方法可以看出,const指針可以指向const對象和非const對象,但是兩者的聲明方法是不同的。
  使用const指針不可以修改其地址值,但是const指針指向非const對象,就可以利用它修改它所指向的對象的值。
  總結:
  初學者之所以會混淆兩者的根本原因是他們頭腦中的一些隱式假定在作怪,也就是說想當然地給要分析的對象強加上一些它們原本並不存在的屬性,這是很多人在處理問題時很容易犯的一個通病。只要語法規則沒有明確說明是非法的,我們就可以拿來用,而沒有必要人爲地加上種種限制。其實要弄清兩者的區別,只要明確兩點就夠了:
  指針本身是const型還是非const型
  指針所指向的對象是const型還是非const型
  const型變量的值在初始化後是不允許改變的(這是根本),那麼const指針其指向是不能變的,const對象其值是不能變的,一切都清楚了
  

     要弄清楚上面的兩個問題,有一個很簡單的辦法:
  如果指針名前緊鄰的關鍵字爲const,那麼它就是一個const指針;如果聲明指針所指向的對象類型前有const關鍵字,那麼它就是一個指向cosnt對象的指針。  應用上面的判斷方法,const int *const p; 就表示指向const對象int的const指針。


    int b = 500;
const int* a = &b;    [1]
int const *a = &b;   [2]

int* const a = &b;   [3]
const int* const a = &b; [4]
如果你能區分出上述四種情況,那麼,恭喜你,你已經邁出了可喜的一步。不知道,也沒關係,我們可以參考《Effective c++》Item21上的做法,如果const位於星號的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;如果const位於星號的右側,const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針所指向的內容爲常量(const放在變量聲明符的位置無關),這種情況下不允許對內容進行更改操作,如不能*a = 3 ;[3]爲指針本身是常量,而指針所指向的內容不是常量,這種情況下不能對指針本身進行更改操作,如a++是錯誤的;[4]爲指針本身和指向的內容均爲常量。
另外const 的一些強大的功能在於它在函數聲明中的應用。在一個函數聲明中,const 可以修飾函數的返回值,或某個參數;對於成員函數,還可以修飾是整個函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章