1. 程式人生 > >C++的頂層const與底層const

C++的頂層const與底層const

首先:頂層const表示指標本身是個常量,底層const表示指標所指的物件是一個常量。更一般的,頂層const可以表示任意的物件是常量,這一點對任何資料型別都適用。底層const則與指標和引用等複合型別的基本型別部分有關。
書上的一些例子:

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

如何區分頂層const與底層const

低層 const:

個人的理解:宣告指向常量的指標就是底層const。

	int num1 = 1;
	int const  *p2 = &num1; 			//底層const
    //*p2 = 2;  						//error C3892: “p2”: 不能給常量賦值
	num1 = 2;
	std::cout<<*p2<<"\n"<<std::endl;	//輸出為2

注意:“常量指標”不一定非要指向常量,只是不能通過解引用符(*)來改變它所指向的內容。
在這裡插入圖片描述

頂層 const

頂層const可以表示任意的物件是常量,這一點對任何資料型別都適用。對於指標:要求本身是常量,宣告時必須初始化,之後它儲存的地址值就不能再改變,可以通過解引用符(*)來改變它所指向的內容。

	int num1 = 1, num2 = 2;
	int *const p1 = &num1; 				//頂層const
	//p1 = &num2;  						//error C3892: “p_b”: 不能給常量賦值
	*p1 = 2; 
	std::cout<<*p1<<"\n"<<std::endl;	//輸出為2

對於指標,一個指標本身新增const限定符就是頂層const,而指標所指的物件新增const限定符就是底層const。

const int *p2 = &ci; 		//p2是const int * 型別(指向整型常量的指標),是底層const
int *const p1 = &i; 		//p1是int * 型別常量(指標常量),是頂層const
const int *const p3 = p2;	//靠右的const是頂層const,靠左的是底層const
//p3是const int * 型常量。

頂層const與底層const的作用

物件拷貝時頂層const不受什麼影響,拷貝操作不會改變被拷貝物件的值。
對底層const卻有限制,常量的底層const不能賦值給非常量的底層const。
在這裡插入圖片描述

	int i = 0;
	const int ci = 42; 				//頂層const
	const int *p2 = &ci; 			//底層const
	const int *const p3 = p2;		//既是頂層const,又是底層const
	p2 = p3;						//都是底層const(p3既是底層const又是頂層const)
	p2 = &i;						//int *, 可以轉換為 const int *
	//int &r = ci;					//int& 不能繫結到const int型別 (error C2440: “初始化”: 無法從“const int”轉換為“int &” 轉換丟失限定符)
	const int &r2 = i;				//const int& 能繫結到int型別