1. 程式人生 > >const限定符用法整理

const限定符用法整理

(1)const的來由

   定義一種變數,我們希望防止程式不小心改變變數的值。因此產生了const限定符。

(2)初始化

   由於const物件一旦建立就不可以改變,所以const物件必須進行初始化;

   只能在const型別的物件上執行不改變內容的操作,其中一種就是初始化。也就是說,即使拿一個const物件去初始化另一個const物件也完全沒有問題,因為拷貝一個物件的值不會改變這個物件。

(3)有效範圍

   預設狀態下,const物件僅在檔案內有效

(4)指標和const

   a.指向常量的指標

   令指標指向常量或非常量,指標本身不能用於改變其所指物件的值。容易想到,必須使用指向常量的指標來存放常量物件的地址。如:

const int num = 624;

int *ptr = &num //錯誤,ptr是普通指標

const int *conPtr = num//正確,conPtr是指向常量的指標

*conPtr = 720;//錯誤,不能用於改變所指物件的值


  特別地,雖然常量物件的地址必須使用指向常量的指標,但是指向常量的指標可以指向一個非常量物件。他們之間並非充要條件。值得注意的是,仍然不能通過指標來改變常量物件的值。

 

  b.const指標

  由於指標本身也屬於一種物件,因此可以把指標定義為常量型別,也叫作常量指標。和普通資料型別相同,常量指標必須在宣告的同時初始化,之後它所指向的地址就無法改變。如:

int num = 624;

int *const ptr = # //ptr是常量指標


  這裡和指向常量的指標作對比,對於常量指標,指標本身是不可以改變的(即指向一個地址後就不可改變),但是可以通過指標修改所指地址存的物件的值,這取決於所指物件的型別。對於上例,如果:

*ptr = 720;//可行,num不是常量型別


  是完全可以的。

  再來看一個例子:

const double pi = 3.14159;

const double *const p = &pi//p是指向常量的常量指標


判斷const是修飾指標還是所指物件有一個辦法,即從右向左判斷。上例中,p的左邊是const,說明是常量物件,再讀一個是*,說明是常量指標;double前的const修飾說明所指物件是常量double型別。可以拿這個方法判斷上面所舉的例子。

(5)const的引用

   將引用繫結到const物件上叫做對常量的引用。另一種說法是“常量引用”。但嚴格來說,由於引用本身不是一個物件,所以這種說法不嚴謹。和上文中的指標作對比就可以知道,因為指標是一個物件,所以存在“指向常量的指標”和“常量指標”兩種不同的型別,而引用只有“對常量的引用”一種,只是人們習慣叫做“常量引用”而已,實際上是一樣的。

   理解常量引用需要注意以下兩點:

   A.常量物件的引用必須是常量引用。

const int bir = 624;

int &zz = bir;//錯誤。非常量引用繫結常量物件

const &smart = bir;//正確。常量引用繫結常量物件


  B.常量引用可能繫結一個非const物件

int day = 720;

int &b = day;//正確,普通的引用

const Int &y = day;//正確,常量引用繫結非const物件

b = 624;//正確

y = 96;//錯誤,不可通過常量引用改變繫結物件的值


   總之,學習常量引用可以和指向常量的指標對照起來,二者在很多時候是一致的。

(6)一些相關概念

   頂層const:指標本身是個常量

   底層const:指標所指物件是個常量

   頂層const可以表示任意的物件是常量。底層const只存在於指標和引用等複合型別的基本型別上。用於宣告引用的const都是底層const,因為引用本身不是型別,無法對它進行修飾。