C++中const的用法

Curtis_發表於2019-03-19

一、修飾區域性變數:

const int n=5;
int const n=5;

這兩種寫法是一樣的,都是表示變數n的值不能被改變了。

需要注意的是,用const修飾變數時,一定要給變數初始化,否則之後就不能再進行賦值了。

const修飾常量靜態字串: 

const char* str="fdsafdsa";

如果沒有const的修飾,我們可能會在後面有意無意地寫str[4]=’x’這樣的語句,這樣會導致對只讀記憶體區域的賦值,然後程式會立刻異常終止

有了const,這個錯誤就能在程式被編譯的時候就立即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發現。

二、修飾全域性變數:

全域性變數的作用域是整個檔案,我們應該儘量避免使用全域性變數,因為一旦有一個函式改變了全域性變數的值,它也會影響到其他引用這個變數的函式,導致出了bug後很難發現。

如果一定要用全域性變數,我們應該儘量的使用const修飾符進行修飾,這樣防止不必要的人為修改,使用的方法與區域性變數是相同的。

 三、常量指標與指標常量:

     1)、常量指標

常量指標是指標指向的內容是常量,可以有一下兩種定義方式:

const int * n;
int const * n;

     注意: 

①、常量指標說的是不能通過這個指標改變變數的值,但是還是可以通過其他的引用來改變變數的值的。

int a=5;
const int* n=&a;
a=6;

 ②、常量指標可以更改指向,即常量指標可以指向其他的地址。

int a[]={1,2};
int b=6;
const int* p=a;
p++;  //A
p=&b; //B

A、B兩行程式碼都是可行的。 

      1)、指標常量

 指標常量是指指標本身是個常量,不能再指向其他的地址,寫法如下:

int *const n;

指標常量指向的地址不能改變,但是地址中儲存的數值是可以改變的 。

int a[]={1,2,3};
int* const p=a;   //p++; ==>不可行,方向不能改變

a[0]=5;   //p所指元素變為5

如果我們將星號讀作‘指標’,將const讀作‘常量’的話,內容正好符合。

const int*p;  int const * p;是常量指標。  =====>所指元素不能改變

int* const p;是指標常量。                        =====>指向不能改變

     指向常量的常指標:

指標指向的位置不能改變,並且也不能通過這個指標改變變數的值

但是依然可以通過其他的普通指標改變變數的值。 

const int* const p;

四、修飾函式的引數:

1、防止修改指標指向的內容:

void StringCopy(char *strDestination, const char *strSource);

其中 strSource 是輸入引數,strDestination 是輸出引數。給 strSource 加上 const 修飾後,如果函式體內的語句試圖改動 strSource 的內容,編譯器將指出錯誤。 

2、防止修改指標指向的地址: 

void swap ( int * const p1 , int * const p2 )

指標p1和指標p2指向的地址都不能修改。 

 3、以上兩種的結合。

五、修飾函式的返回值:

如果給以“指標傳遞”方式的函式返回值加 const 修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標

 例如函式:

const char * GetString(void);

如下語句將出現編譯錯誤:

char *str = GetString();

 正確的用法是:

const char *str = GetString();

六、修飾函式:

宣告一個成員函式的時候用const關鍵字,是用來說明這個函式是 "只讀(read-only)"函式,也就是說明這個函式不會修改任何資料成員(object)。 

為了宣告一個const成員函式, 把const關鍵字放在函式括號的後面。宣告和定義的時候都應該加上const關鍵字

 注意:

函式後的const表示這個函式不會修改所處class的member variable(成員變數)。

【error】non-member function cannot have cv-qualifier 

===> 當前的function是non-member function,並不屬於任何class,因此會報錯。

錯誤程式碼: 

#include<iostream>
using namespace std;

void print(int arr[]) const
{
	//arr[0]=3;
	cout<<*arr;	
}

int main()
{
	int a[]={1,2,3};
	print(a);
			
	return 0;
} 

錯誤型別:

 

 參考:https://blog.csdn.net/xingjiarong/article/details/47282255

相關文章