可改不可改? 常量表達式是指在編譯器編譯時期就可以的到值的表達式,例如:const int a = 3,雖然聽起來很簡單,但實際上很容易犯錯。本文簡要總結它們的不同: 關於const:頂層const和底層const 一般,我們聲明const用來存儲不變的恆定量: const int MAXN = i ...
可改不可改?
常量表達式
是指在編譯器編譯時期就可以的到值的表達式,例如:const int a = 3
,雖然聽起來很簡單,但實際上很容易犯錯。本文簡要總結它們的不同:
關於const:頂層const和底層const
一般,我們聲明const用來存儲不變的恆定量:
const int MAXN = int_max;
用指針指向:
const int *pMAXN = &MAXN;
這條語句開始的const int
實際上是為了MAXN
的類型做出的匹配,我們得到的pMAXN
實際上是可修改的。
那麼如何讓 pMAXN 不可修改呢?
c++採用’雙const‘的方法:
const int * const pMAXN = &MAXN;
這樣,pMAXN
成為了不可修改值的,指向MAXN
的指針。
其中,可以修改值的const就被稱為底層const,而不可修改值的稱為頂層const。
const int *pMAXN = &MAXN; //底層const
const int * const pMAXN = &MAXN; //左邊底層const,右邊頂層const
typedef的誤區
很顯然,當我們使用typedef的時候,const又產生了問題:
typedef char *pstring;
const pstring *ps;
在有上面的語句的基礎上,這條語句是什麼意思?
const pstring cstr = 0;
一般情況下,我們看到pstring
就會直接去找它的定義,這種習慣是錯誤的!我們應該按照次序,先讀這條語句。
首先,pstring
加上了const
修飾符,這代表定義的語句是const狀態,是常量表達式。其次,pstring
定義的是指向char
類型的指針,所以,綜上所述,這條語句聲明瞭一個指向char
的常量指針
即,指針的值不可修改。
那這一條語句呢:
const char *cstr = 0;
它聲明瞭一個指向const char
類型的指針。指針的值可以修改。