const不同位置帶來的區別


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 const after 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 (變量名) 當然都是名詞。

  1. const char * p 讀作:p is a pointer to a const char,譯:p 是一個指針(變量),它指向一個常量字符(const char)。
  2. char * const p 讀作:p is a const pointer to a char,譯:p 是一個常量指針(const p),它指向一個字符(變量)。

從兩處藍色標記也能看出前面提到的“const 修飾離開最近的對象”的說法。

出處:https://blog.csdn.net/JPEXE/article/details/2157436


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM