標籤:

關於在C++ Primer一書中 「const是頂層的」的問題?

如下圖所示,這裡是否如我想的應該是「const是底層的」而非「const是頂層的」

我買的版本是下圖所示的,不知道有沒有新版本修訂了這個錯誤,還是說我自己理解錯了書是對的?


有一個特別簡單的方法來區分頂層和底層const,當你學了模板之後,你可以定義一個

template&
using ptr = T*;

那麼const ptr&就是T* const,表示指針本身不能修改

ptr&就是const T*,表示指針指向的對象不能修改

你看沒有了C語法的翔,用C++自己的東西表示const指針,一目了然


頂層這個意思是從AST的角度來講的。const int的節點是const&和T=int,const當然是頂層。如果是const int*就不是了,下面的int* const仍然是。

要是當時審校的範圍包含這個的話,我一定會建議他們把這句話乾脆去掉。


const 就是頂層的,書上沒有錯。

所謂底層只會出現在指針和引用當中,其他的一律是頂層(這樣是不是好理解了呢)。


底層const只有在指針還有引用裡面有。

頂層const指的是變數作為數據類型本身的屬性,不論是基本類型還是指針

const int ci //int const ci

int * const cpi

這兩個的const修飾的都是變數

而const int *pci里修飾的是指向的對象,指向的是const int,這叫底層const。


如何區分頂層const和底層const?

我認為可以總結為以下三個原則:

1.包含指針的聲明:靠近指針*的是頂層const,靠近類型的const是底層&<如果有&>

示例:

int i = 5;
int *const p1 = i; // 頂層const
const int *const p3 = i; // 靠右的const是頂層const,最左邊的const是底層const

2.不包含指針的聲明:均為頂層const

示例:

const int ci = 42; // 頂層const

3.用於聲明引用的const都是底層const

示例:

const int r = ci; // 底層const


const int a = 1;頂層const

int* const a = 1;底層const

頂層在外面,底層在中間。我是這麼記的,剛開始容易忘,過段時間就記住了


太神奇了,我今天下午也在看這個地方。。


推薦閱讀:

《C++ Primer》和《C++ Primer Plus》有哪些區別?
string頭文件和string.h頭文件是一樣的?
c++ primer 第五版關於decltype的一個問題?
為什麼c++要「在頭文件中聲明,在源文件中定義」?
關於C++ primer 「未知數目的輸入」 的問題(結果與預期不符)?

TAG:CPrimer |