Const用法詳解

2021-05-27 02:03:20 字數 1983 閱讀 6324

const用法詳解

1、  const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行靜態型別安全檢查;而對後者只能進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應);

2、    有些整合化的除錯工具可以對const常量進行除錯,但是不能對巨集常量進行除錯。

要注意的是,const不僅僅用於定義符號常量,凡是需要編譯器幫助我們預防無意中修改資料的地方,都可以使用const,比如const資料成員、const成員函式、const返回型別、const引數等。

1、 指向const物件的指標

指標指向const物件,不允許用指標來改變其所指的const值。為了保證這個特性,c++語言強制要求指向const物件的指標也必須具有const特性:

const double *cptr;

這裡的cptr是乙個指向double型別const物件的指標,const限定了cptr指標所指向的物件型別,而並非cptr本身。也就是說,cptr本身並不是const。在定義時不需要對它進行初始化,如果需要的話,允許給cptr重新賦值,使其指向另乙個const物件。但不能通過cptr修改其所指物件的值:

*cptr = 42;    //error,*cptr might be const

const double pi = 3.14;

double *ptr = π      //error: *cptr might be const

const double *cptr = π //ok:cptr is a pointer to const

const int universe = 42;

const void *cpv = &universe;   //ok:cpv is const

void *pv = &universe;         //error: univer is const

double dval = 3.14;

cptr = &dval;       //ok:but can』t change dval through cptr

儘管dval不是const物件,但任何企圖通過指標cptr修改其值的行為都會導致編譯時的錯誤。cptr一經定義,就不允許修改其所指物件的值。如果該指標恰好指向非const物件時,同樣必須遵循這個規則。

在實際的程式中,指向const的指標常用作函式的形參。將形參定義為指為const的指標,以此確保傳遞給函式的實際物件在函式中不因為形參而被修改。

2、 const指標

除指向const物件的指標外,c++語言還提供了const指標——本身的值不能修改:

int errnum = 0;

int *const curerr = &errnumb;  //curerr is a constant pointer

我們可以從右向左把上述定義語句讀作「curerr是指向int型物件的const指標」。與其他const量一樣,const指標的值不能修改,這就意味著不能使curerr指向其他物件。任何企圖給const指標賦值的行為(即使給curerr賦回同樣的值)都會導致編譯時的錯誤:

curerr = curerr;   //error:curerr is const

與任何const量一樣,const指標也必須在定義時初始化。

指標本身是const的事實並沒有說明是否能使用該指標修改它所指向物件的值。指標所指物件的值能否修改完全取決於該物件的型別。例如,curerr指向乙個普通的非常量int型物件errnumb,則可使用curerr修改物件的值。

3、 指向const物件的const指標

還可以如下定義指向const物件的const指標:

const double pi = 3.14159

const double *const pi_ptr = π

既不能修改pi_ptr所指向物件的值,也不允許修改該指標的指向。

const用法詳解

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

const 用法詳解

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

const用法詳解

看 到const 關鍵字,很多人想到的可能是 const 常量,其實關鍵字 const 並不能把變數變成常量!在乙個符號前加上 const 限定符只是表示這個符號 不能被賦值。也就是它的值對於這個符號來說是唯讀的,但它並不能防止通過程式的內部 甚至是外部 的方法來修改這個值 c專家程式設計 p21 ...