目錄
前言
本博文又名const T vs. T const ——Dan Saks 讀後感,鏈接見文末
const位置解讀
const T p;//p is a T const.p爲只讀,地址不能變,存儲內容不能變
T const *p;//p is a point to T const.p是一個指向T類型的指針,地址能改變,地址內的存儲內容不能變
const T *p;//同2
T *const p;//p is a const point to T,p是一個指向T類型的指針,地址不能變,地址內的存儲內容能變
const T *const p;//p is a const point to T cosnt //p是一個指向T類型的指針,地址不能變,地址內的存儲內容也不能變
T const *const p;//同5
比較好的習慣
在C和C++中的每個聲明都有兩個主要部分:零個或者更多聲明說明符,和一個以上用逗號隔開的聲明符
例如:
static unsigned long int *x[N];
static unsigned long int//聲明說明符
*x[N]//聲明符
一個聲明符就是被聲明的名稱,可能伴有操作符,比如*,[],(),和(C++中的&。正如你所知的,聲明中的符號*表示“指針”,[]表示“序列”因此,*x[N]表明x是個“有N個指針元素的序列,分別指向某某”,某某就是聲明中指定的類型。例如:
static unsigned long int *x[N];//把x聲明爲“指向unsigned long int 的N個指針元素的序列”的一個對象。
爲什麼我知道*x[N]是一個指針的序列,而不是指向一個序列的指針?它遵循以下規則:
在一個表達式中,聲明符中的操作根據他們的優先級來分組
例如,在C和C++中,如果檢查最近優先級圖標,你會發現[]的優先級比更高。因此聲明符X[N]表明x是一個優先於指針的序列。原括號在聲明符中有兩個作用:第一,作爲函數調用的操作符,第二,用來分組。作爲函數調用的操作符,()和[]的優先級相同。用作分組時,()的優先級最高的。
另外有個重要觀點:
聲明說明符在一個聲明中出現的順序並不重要
聲明說明符const和volatile不尋常,因爲:
能出現在聲明符中的聲明說明符只有const和volatie
所以:
void *const vectorTable[]//可以
*const void vectorTable[]//是錯誤的
下面的聲明是等同的:
const void *vectorTable[]//大多數C和C++程序員喜歡把const和volatile寫在其他類型的說明符的左邊
void const *vectorTable[]//我更喜歡把const和volatile寫在右邊,並且強烈推薦這麼寫。
const用法詳解
C++基本上是按從頭到尾,從左到右的順序來讀,但是指針的聲明,從某種意義來講卻是倒着的。指針的聲明是從右到左來看。
把const放在其他類型說明符的右邊,可以嚴格的從右到左來看指針說明,還可以把const從“右邊的”位置提出來,如:
T const *p;//把p聲明爲“指向const T的指針”,非常準確
T *const p;//把p聲明爲指向T的const指針“也能正確理解
參考資料
const T vs. T const ——Dan Saks 【翻譯】
const T vs. T const ——Dan Saks
const指針和指向常量的指針