1. 程式人生 > >const的基本用法

const的基本用法

     我們經常在程式語言中見到或使用到const,大家都知道const是定義常變數的意思,但是它是如何進行定義的,又有哪些使用規則呢。下面我和大家一起來了解了解。

      在瞭解const之前,我們先來了解一下左值這個東西,左值:就是放在賦值符號左邊的值,它為具有寫許可權,就是說我們可以通過賦值符號來改變它的值。

     1、const定義常變數。

      用const定義常變數,他所定義的這個常變數不能寫,只能讀,就是說const定義的常變數只具有讀許可權,不具有寫許可權,不能通過賦值符號來改變這個常變數的值,只能讀取這個值。既然只能讀取這個值,那也就是說在定義的時候必須給它初始化,如果不進行初始化,需要通過賦值語句給它賦值的話 ,那常變數也就可以改變了,顯然是不合理的。

int main()
{
	int const a = 10;
	int b = 20;
	//a=b;//error
	b=a;

	return 0;
}

     就像上面,我們把變數a定義成整型常變數,再把b的值賦值給a,這時候系統就會提示我們賦值符號左邊必須是可修改的左值,然而我們把a的值賦值給b,這又是可以的,這就是我們說的const定義的常變數只有讀許可權沒有寫許可權,不能更改。

     這時候有人就會問,我們應該怎麼定義和使用const呢?定義的時候,它到底是放在資料型別的左邊還是右邊?

     2、const與資料型別的位置。

      在定義常變數時我們有以下兩種情況,第一種就是 資料型別 const 變數,例如 int const a=10;第二種就是 const 資料型別 變數,例如 const int b=20;讓我們通過下面一段程式碼來看看這兩種情況有什麼區別?

int main()
{
	int const a = 10;
	const int b = 20;

	int c;
	c = b;
	//b=a;//error
	//a=c;//error
	return 0;
}
       我們可以看出,無論是把const放在資料型別的左邊還是右邊,所定義的這兩個整型常變數都是無法改變的值,他們都只具有讀許可權,沒有寫許可權。所以我們得出結論:資料型別對於const而言是透明的,例如 int const a=10;等價於const int a=10;

       有人說const這麼簡單,不就是定義一個無法改變的值嗎?這有什麼好了解的?如果const只有這麼一點點作用,那它也太簡單了 ,它難就難在了和指標一起使用。

        3、const與指標的使用。

        在const與資料型別中我們得出結論資料型別對於const來說是透明的,const無論是放在資料型別左邊還是右邊都是一樣的,那麼在定義常變指標量變數時是否也是這樣呢?我們先來定義一個指標變數*p,int *p;那麼我們的const放在const int *p;int const *p;int * const p;這三個中的哪一個呢,他們又有哪些不同的地方?我們還是通過下面一段程式碼來看看這三種情況有什麼區別?

int  main()
{
	int a = 100;
	int b = 200;
	
	int *p = &a;
	const int *p1 = &a;
	p1 = &b;
	//*p1 = 100;//error

	int *const p2 = &a;
	//p2 = &b;error
	*p2 = 200;
	
	int const *p3=&a;
	p3 = &b;
	//*p3 = 100;//error

	return 0;

}

        從上面就可以看出*p1和*p2一樣,他們的區別只是const與資料型別的位置不同,然而資料型別對於const而言是透明的,不存在先後的問題,再看*p1與*p2的區別,*p1是const int *p1=&a;const直接修飾的是*p1,p1的值可以通過賦值語句將b的地址賦值給它,但是它不能通過解引用去修改a的值;*p2是 int *const p2;const直接修飾p2,p2就只能儲存a的地址無法更改,但卻可以通過解引用去修改a的值。我們可以得出一個結論:const用於封鎖直接修飾的內容,將該內容變為只讀。

        那麼我們就有了一個新的問題,我們應該如何去儲存一個常變數的地址?

         4、常變數地址的儲存。

         我們知道普通指標變數不能儲存常變數的地址,那常變數的地址要怎麼去儲存,是用常指標變數還是指標常變數,或者是用常指標常變數儲存,我們用下面一段程式碼來試一試。

int main()
 {
	 int const a = 100;   //a為只讀,不能寫
	 int b = 200;
	 //int *p1 = &a;  //error   *p1可讀可寫
	 
	 const int *p2 = &a;//*p2 只讀,不能寫
	 //p2 = &b;//error   p2 只讀
	 //int *const p3 = &a;//error  p3只讀,不能寫,*p3可讀可寫
	 const int *const p4 = &a;   // *p4可讀不能寫
	 //p4 = &b;//error   p4只讀,不能寫
	
	 return 0;
 }

          我們可以看出整型常變數a的地址只能用p2和p4來儲存,而p1和p3就不能儲存。a為const常變數,只有讀許可權,沒有寫許可權,我們可以看出*p1和p1有讀許可權有寫許可權,*p2和p2只有讀許可權,*p3既有讀許可權又有寫許可權,p3只有讀許可權,*p4和p4都只有讀許可權,能儲存a的地址是p2和p4,p1和p3的許可權大於a,所以他們無法儲存a的地址,p2與p4的許可權與a相同,所以它們可以儲存a的地址。我們可以得出:許可權只能同等傳遞或縮小傳遞,不能放大傳遞。