const不同位置帶來的區別
今天同學問我數據結構時,我對以下代碼懵了一下:
template <class T> class Link{
public:
T data;
Link<T>* next;
Link(const T info, const Link<T>* nextValue=NULL){
data = info;
next = nextValue;
}
Link(const Link<T>* nextValue){
next = nextValue;
}
};
這是一個單鏈表的節點定義,我第五行,第一個構造函數的第二個參數有點懵。
我當時尋思着,把這個指針定義為const類型,那不永遠都指向空了嗎?那我為什么后面還能改變呢?查詢之后發現是我對const不同位置的作用不了解。
以下兩種聲明方式的區別是什么?
const double* p;
double* const p;
眾所周知,const是規定任何類型的一個變量為常量。而C++內部的規定是,const將修飾緊隨他的對象。引用Stack Overflow的原話是:
You can always put the
constafter whatever is declared const.
所以第一種形式,也就是
const double* p;
這個const是指這個double是不變的,p是一個指向常量雙精度浮點數的指針。也就是這個double數的值不可以再改變了。
所以我最開始提出的例子,是指這個構造函數傳入的節點不能改變。而不是這個指針永遠都指向NULL。
第二種形式,是
double* const p;
同理,是指p是一個指向雙精度浮點數的常量指針,不變的是p的值,也就是說p不能再指向別的對象。
那么,如果沒有指針的話,下面這兩種情況是沒有區別的。
const int a;
int const a;
但是一般建議寫上面那種形式。
這里再轉載別人文章里的一段話:
Bjarne 在他的《The C++ Programming Language》里面給出過一個助記的方法——“以 * 分界,把一個聲明從右向左讀”。
注意語法,* 讀作 pointer to (指向...的指針),const (常量) 是形容詞,char (變量類型) 和 p (變量名) 當然都是名詞。
- const char * p 讀作:p is a pointer to a const char,譯:p 是一個指針(變量),它指向一個常量字符(const char)。
- char * const p 讀作:p is a const pointer to a char,譯:p 是一個常量指針(const p),它指向一個字符(變量)。
從兩處藍色標記也能看出前面提到的“const 修飾離開最近的對象”的說法。
