頂層const表示指針本身是個常量,底層const表示指針所指的對象是常量。其比較繞的地方是頂層const和底層const之間的拷貝(賦值)關係
1 void testConst2() { 2 3 int i = 0; 4 int* const p1 = &i; //頂層const 5 const int ci = 42; //頂層const 6 const int* p2 = &ci; //底層const 7 const int* const p3 = p2; //底層const且也是頂層const 8 const int& r = ci; //底層const 9 10 int* p; 11 p = p1; //頂層const一般可進行拷貝操作 12 //p = p3; 底層const在進行拷貝操作時會有限制,此處錯誤 13 //p = p2; 非常量可以轉換成常量,但反之不行,此處錯誤 14 p2 = p3; //把p3當做底層const,纔可進行底層const給底層const的拷貝 15 16 }
底層const不能拷貝給頂層const,因爲頂層const本身不能修改。
頂層const拷貝給底層const時,一般沒有問題
還有一種就是底層const拷貝給底層const,當然了頂層const不能拷貝給頂層const
在12行的代碼中,p3作爲頂層const拷貝給p沒有任何問題,但p指向的是非常量整型,那麼可以通過*p來修改p指針所指向地址中的內容,此時p指針的地址和p3指針的地址相同,p3也是底層const,不允許修改其指向地址中的內容,就會發生衝突,所以編譯器會直接報錯