C 之const關鍵字的幾種用法

2021-08-29 12:35:35 字數 3421 閱讀 1551

const 資料型別 變數名 = 值;

例如:const int i = 1;

i = 2;//錯誤

//const int j ;j = 1;錯誤

宣告的同時必須初始化,雖為變數,但是不能更新其值。

又有常量性質,可以進行陣列大小的確定,int a[i] = ; ,是因為const編譯時,執行。

儲存資料區域和定義位置(全域性,函式內,類中等)有關。

const 資料型別 & 引用變數名 = 變數名;

例如:int i = 1;

const int j = 2;

const int & m = i; //常量引用,引用非常量。

const int & m = j; //常量引用,引用常變數,並且m和j的值都不可更新。

int & m = j; //錯誤,j 為常變數,m 為非常量引用,引用是已存在變數的別名,此時m和j不能等價。

const int & 為「常量引用」,物件可以是常量,也可以是非常量。

注意:常引用可以引用非常量、常變數。而非常量引用只能引用非常量。

資料型別 * const 指標變數名 = 變數名;

例如:int i = 1;

int j = 2;

int * const m = &i;

// int * const m;m = &i;錯誤,常指標,指標必須初始化。

m = &j;m = null;//都錯誤,指標常量指向不可被修改。

注意:指標常量(資料型別 * const)的「常」修飾的時指標,不是指向的值,所以指標為「常」,指向的值可更新(*m=2;*m=j)。

const資料型別 * 指標變數名 = 變數名;

例如:const int i = 1;

int j = 2;

const int * m = &i;

m = &j;m = null;//都正確,常量指標指向可被修改。

const int a[3]=;//常陣列每個元素必須初始化,並不可修改其值。

陣列名作為指標時不能賦值給非常量指標。

注意1:常量指標(const資料型別 *)的「常」修飾的時變數,不是指標,即指標指向常變數,指向的值不可更新(*m=2;m=j)。

注意2:常量指標不可以賦值給非常量指標(int * p = m;錯誤),但是非常量指標可以賦值給常量指標(int * q =&j;m = j;正確)。

注意3:vs2017中「 char str = 「1234asd56」; 」 會報錯:"const char * "型別的值不能用於初始化"char * "型別的實體,但是vs2015及其以前的版本都不會報錯警告之類的。

const資料型別 * const 指標變數名 = 變數名;

例如:const int i = 1;

int j = 2;

const int * const m = &i;

注意:指標和指向的值都被「常」所修飾,所以都不可修改。

參考以上內容

例如1:

int sun ( const int a, const int b )

函式引數表中,含有兩個const 形參:a,b。const的存在使得sum函式只能使用a,b的值而不能修改。

例如2:

int sun ( const int & a, const int & b )

函式引數表中,含有兩個形參a和b對實參的引用,引用是對指標的封裝,實參會隨形參值變化而變化。const的存在使得sum函式只能使用a,b的值而不能修改,所以實參的值也不會因呼叫此函式而修改。

例如3:

char *strcpy(char * str1,const char * str2)

函式引數表中,由於str1是需要修改的,所以不用const修飾,而str2是傳遞資料進來的,並不希望進行改變,所以可以用const修飾。

修飾函式的返回值,意味著該返回值不能被修改。如果傳值並返回位址,const將保證該位址上的內容不會被改變。這就意味著該函式不能作為左值使用,在這種情況下,const通常也是與引用和指標一起使用的。

1、修飾成員資料

有普通常變數,指標常量和常量指標,普通常變數資料成員和指標常量資料成員在c++中要在類的初始化列表中初始化,但是靜態常資料成員在類外說明和初始化。

#includeusing namespace std;

class a ;

void display() };

const int a::b = 3; //靜態常資料成員在類外說明和初始化

int main()

2、修飾成員函式

該成員函式不更新物件的資料成員,一般都加上const修飾,也建議這麼做。

在定義與使用常成員函式時要注意:

a、const是函式型別的乙個組成部分,因此在函式實現部分也要帶有const關鍵字。

b、常成員函式不能更新物件的資料成員,也不能呼叫該類中沒有用const修飾的成員函式。

c、常物件只能呼叫它的常成員函式,而不能呼叫其他成員函式。這是c++語法機制上對常物件的保護,也是常物件唯一的對外介面方式。

d、const關鍵字可以用於參與過載函式的區分。一般物件可以呼叫常成員函式也可以呼叫一般成員函式,過載時優先選擇呼叫一般成員函式。正因如此,可以根據非常物件和常物件寫出兩個不同版本,一般常物件為更優版本

注意:這裡建議不更新物件的資料成員都寫成常成員函式,是為了可供常物件呼叫,但是該常成員函式又不能呼叫該類中沒有用const修飾(修改了物件的資料成員)的成員函式。可能會存在矛盾,所以說一般、建議,但不得不說是個良好的習慣。

3、修飾類的物件

表示該物件為常量物件,在物件的生命期中其中的任何成員都不能被修改,必須在定義的時候由建構函式初始化。常物件不能訪問非常成員函式,只能訪問常成員函式。

#include using namespace std;

class clock

clock(clock&p)//拷貝建構函式

void showtime()

void showtime ()const //常成員函式

void settime(int h = 0, int m = 0, int s = 0)

};int main()

/*執行結果

10:10:10

const: 9:9:9

const: 10:10:11

const: 0:0:0

0:0:0

*/

a、33-35行是常物件的三種定義並初始化情況,注意clock const c4; 時,建構函式形參必須預設初始值。

b、36行和41行說明了一般物件呼叫成員函式過載時優先選擇呼叫一般成員函式,並不會產生二義性。也就是說,如果只有常成員函式,一般物件會呼叫常成員函式。

c、常物件,不能呼叫非常成員函式,也不能被更新!

C 之const關鍵字用法

c const 允許指定乙個語義約束,編譯器會強制實施這個約束,允許程式設計師告訴編譯器某值是保持不變的。只有乙個const,如果const位於 左側,表示指標所指資料是常量,不能通過解引用修改該資料 指標本身是變數,但可以指向其他的記憶體單元。等價於 const int p int const p...

關鍵字的用法 C 中const關鍵字用法總結

ark2000 看完了c primer的基礎篇,對const還是有點陌生,在這裡小小地總結一下吧。在變數的定義前加上const修飾符即可完成const物件的建立。const int val 5 const變數的值不能改變。val 5 error assignment of read only var...

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...