頂層const和底層const

2021-08-07 17:41:32 字數 1874 閱讀 8792

1. 頂層 const 與底層 const概念

指標本身是乙個物件,因為,指標實際對應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,

因此,指標是乙個常量與指標所指向的是乙個常量是兩個完全不同的概念,

頂層 const表示的是指標本身是乙個常量, 底層const 表示的是指標所指的物件是乙個常量,

更一般情況下,頂層const可以表示任意物件是乙個常量,這對於算術型別、類、指標等任何資料型別都是成立的,

底層 const則與指標和引用等復合型別的基本型別部分有關,

比較特殊的是,指標既可以是頂層 const也可以是底層 const,這一點與其他型別區別明顯。

2. 頂層 const 與底層 const在執行拷貝操作時的不同

對於頂層 const 與底層 const,在執行物件拷貝時有著明顯的不同:

(1)頂層 const 不受什麼影響

int i = 0;  

const int ci = 42;       // 不能改變 ci 的值,這是乙個頂層 const  

i = ci;                        // 正確:ci 是乙個頂層 const,對此操作無影響  

const int *p2 = &ci;  // 允許改變 p2 的值,這是乙個底層 const  

const int *const p3 = p2;  // 靠右的 const 是頂層 const ,靠左的是底層 const  

p2 = p3;                  // 正確:p2 和 p3 指向的物件的型別相同,p3 頂層 const 的部分不影響

(2)底層cons的限制不能忽略

要求拷出和拷入的物件有相同的底層const 資格或者能轉換為相同的資料型別,一般非常量能夠向常量轉換,反之則不行

int *p = p3;           // 錯誤:p3 包括底層 const 定義,而 p 沒有  

p2 = p3;                // 正確:p2 和 p3 都是底層 const  

p2 = &i;                 // 正確:int* 能轉換成 const int*  

int &r = ci;  // 錯誤:普通的 int& 不能繫結到 int 常量上  

const int &r2 = i;   // 正確:const int& 可以繫結到乙個普通 int 上

來分析一下以上的**:

int *p = p3;

p3 既是乙個頂層 const又是乙個底層 const,在執行物件拷貝時,頂層 const 部分沒有任何影響,完全不用考慮,但是 p3 又是乙個底層 const ,

它要求拷入的物件有相同的底層 const資格,而 p 沒有,所以是錯的;

p2 = p3;

p3 要求拷入的物件擁有相同的底層const 資格,p2 也是乙個底層 const,故正確;

p2 = &i;

對 i 取位址將得到 int*, p2 是const int*,前者是非常量,後者是常量,賦值語句等號右側的型別向左側轉換,非常量能夠向常量轉換,故正確;

int &r = ci;

由左側部分我們知道,需要得到的是乙個繫結到ci 上的引用,而繫結到 ci 上的引用的型別是 const int&,等號左側的型別是 int&,賦值語句等號右側的型別向左側轉換,

但是常量不能向非常量轉換,所以是錯誤的;

const int &r2 =i;

由左側部分我們知道,需要得到的是乙個繫結到i 上的引用,而繫結到 i 上的引用的型別是 int&,等號左側的型別是 const int&,賦值語句等號右側的型別向左側轉換,

一般非常量可以向非常量轉換,所以是正確的。

頂層const和底層const

頂層const 本身是乙個常量 底層const 所指的物件是乙個常量 int const p1 i const修飾p1,p1本身是乙個const,所以這個const是頂層const const int ci 42 const修飾ci,ci本身是乙個const,頂層 const int p2 ci c...

頂層const和底層const

今天讀到函式這章,發現又說到了頂層 高層 const和底層 低層 const,然而自己對他們還是一知半解,就重讀了有關這一部分的知識。感覺自己已經理解了,總結一下。首先這裡是書中的原話 用名詞頂層const表示指標本身是乙個常量 用名詞底層const表示指標所指的物件是乙個常量。我們知道const是...

頂層const和底層const

清晰一組概念 首先只有指標才存在頂層與底層const之別 引用也可以算有 引用的本質是指標.然後簡述下const的用法 const修飾的型別 首先看const前面是否有型別 type 如果有就是修飾前面的type否則向後看。例項 const int a const 修飾int int const a...