const用法詳解

目錄

前言

  本博文又名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指針和指向常量的指針

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