1. 程式人生 > >c++的const小總結(2)

c++的const小總結(2)

通過 con 其他 綁定 strong col 指針和引用 兩個 tle

c++的const小總結(1) http://www.cnblogs.com/MyNameIsPc/p/7091631.html

  • 頂層const和底層cnost

先憑經驗區分一下兩者的區別?

在primer c++裏看到這個章節時,我有點疑惑。

primer c++上面也解釋的稀裏糊塗

如前所述,指針本身是一個對象,它又可以指向另外一個對象。因此,指針本身是不是常量以及指針所指的是不是一個常量就是兩個相互獨立的問題。用名詞頂層const(top-level const)表示指針本身是個常量,而用名詞底層const (low-leve丨const)表示指
針所指的對象是一個常量。

直到我關註了英文:

頂層const(top-level const)  底層const (low-level const)

所以說白了頂層const就是本身是const。自己最重要嘛。

  • 現在我們來總結性的區分一下這兩種const

更一般的,頂層const可以表示任意的對象是常量,這一點對任何數據類型都適用,如算術類型、類、指針等。底層const則與指針和引用等復合類型的基本類型部分有關。比較特殊的是,指針類型既可以是頂層const也可以是底層const,這一點和其他類型相比區別明顯。

當執行對象的拷貝操作時,常量是頂層const還是底層const區別明顯。其中,頂層const不受什麽影響。另一方面,底層const的限制卻不能忽視。當執行對象的拷貝操作時,拷入和拷出的對象必須具有相同的底層const資格,或者兩個對象的數據類型必須能夠轉換。一般來說,非常量可以轉換成常量,反之則不行:

#include <iostream>
using namespace std;

int main(){
    int i = 0;
    int *const p1 = &i; //不能改變p1的值,這是一個頂層const
    const int ci = 42; //不能改變ci的值,這是一個頂層const
    const int *p2 = &ci; //允許改變p2的值,這是一個底層const
    const int *const p3 = p2; //靠右的const是頂層const,靠左的是底層const
    const int &r = ci; //
重要:用於聲明引用的const都是底層const return 0; /// i = ci; //正確,拷貝ci的值,ci是一個頂層const,對此操作無影響 p2 = p3; //正確,p2和p3指向的對象類型相同,p3頂層const的部分不影響 int *p = p3; //錯誤,p3包含底層const的定義,而p沒有 p2 = &i; //正確,int*能轉換成const int* int &r = ci; //錯誤,普通的int&不能綁定到int常量上 const int &r2 = i; //正確,const int&可以綁定在一個普通int上 }

說白了,也就是(1)中總結的問題。如果一個指針a的底層有const,另一個指針b的底層沒有const,那麽b就不能賦值為a。

好像這可以通過類型轉換來解釋,不過我還沒懂。

就說到這裏啦

c++的const小總結(2)