C 中const限定符

2022-09-23 06:57:14 字數 3329 閱讀 7870

const基礎

c++中的const,用於定義一個常量,這個常量的值不能被修改。因為const物件一旦建立就不能修改,所以const物件必須初始化。const常量特徵僅僅在執行改變其本身的操作時才會發生作用,所以在進行其他操作時,const常量和普通變數沒有區別。

它的宣告方式為

void

main()

const與指標

1.指標常量(pointer to const )

指標常量也就是指向常量的普通指標。也就是不能通過指標修改所指向的物件,但可以修改指標本身的指向。這裡要注意的是指標常量不要求指標一定要指向一個const常量,只是指不能通過指標修改所指向的物件。它的宣告形式為:

const int* d;

2.常量指標(const pointer)

常量指標是指向一個物件的常量指標。常量指標必須初始化,因為常量指標不能更改其指向。這裡要注意的是普通指標(包括非常量指標和常量指標)無法繫結一個常量物件。要想指向一個常量物件,必須使用指標常量,但是指標常量所指向的物件卻不一定是常量物件,這裡要注意區分。為了使常量指標能夠指向常量物件,於是有了指向常量的常量指標。宣告如下:

int* const e; //

指向普通int型量的常量指標。int*為const(指標變數不能被修改,但是它所指向記憶體空間可以被修改

const

int* const f;//

指向int常量的常量指標(指標和它所指向的記憶體空間,都不能被修改)

指標常量和常量指標的區分

指標常量(pointer to const )和常量指標(const pointer)會比較容易混淆。我在網上檢視時,找了一個我覺得不錯的區分方法,即 “以*為中間劃一條線,看const修飾誰就誰就是常量”。如,const int * d;以*劃線後結果為”const int“,const修飾的是int,也就是指標所指向的物件,所以d是一個指標常量。同理對於int * const e; 劃分後為const e,const修飾指標e,所以e是一個常量指標。

const的引用

不同於指標本身是一個物件,引用並不是一個物件,所以不存在常量引用,只有對常量的引用(reference to const),但是在c++中,引用一旦繫結到其他物件上,就不允許改變繫結的物件,所以引用本身具有const的特性。有的地方可能會將對常量的引用簡稱為常量引用,這裡要知道,常量引用指的是什麼。

一般要求,引用的型別必須與被引用的物件型別相同,但在有關const的引用中有例外的情況:即初始化常量引用時允許使用任意可以轉換為引用型別的表示式作為初始值。例如

int i = 10

;const

int &r1 = i; //

正確,可以將const int& 繫結到一個普通int物件

const

int &r2 = 10; //

正確,r2是一個常量引用

const

int &r3 = r1 * 2; //

正確,r3是一個常量引用

int &r4 = r1 * 2; //

錯誤,r4是一個普通非常量引用

能夠這樣初始化的原因是:對於const int &r1 = i; 這樣的**,編譯器會拆解為:

const

int temp =i;

const

int &r1 = temp;

這裡系統生成了一個臨時量物件temp,然後將r1繫結在了temp上。這裡很多人可能會有疑問,為什麼可以將引用繫結到一個臨時物件上?c++的標準規定了:當一個臨時物件被繫結到一個引用時,臨時物件的生命週期 >= 引用的生命週期("如果一個臨時性物件被繫結於一個引用,物件將殘留,直到被初始化之引用的生命期結束"(見《inside the c++ object model》page275))。但必須要注意的是隻有常量引用才能繫結到臨時量物件。所以 int &r4 = r1 *2 ;是不能通過編譯的。同時也要認識到,常量引用可以引用一個非const的物件。

類中的const

在c++類中,可能出現const的地方有:

1.常量物件

常量物件,就是宣告類的例項時加上const,如下:

const myclass myclass;

2.常量成員資料

就是宣告在類中的const資料,和在類外一樣。

3.常量成員函式

常量成員函式的主要作用是可以被常量物件呼叫。常量成員函式的宣告有兩種,如下:

void func(int a) const{};

void const func(int a){};

這兩種方式沒有區別,它們的本質都是void func (const classname *this, int a); const 修飾的不是形參a,而是this(this是一個額外的隱式引數,用來訪問當前物件,它的型別預設是指向類型別非常量版本的常量指標),與const所寫的位置無關。因為c++對類的this指標做了隱藏,本質上,const指標修飾的是被隱藏的this指標所指向的記憶體空間。這裡的func()函式,如果不新增const關鍵字,就是一個普通的成員函式,此時this的型別是classname* const,即this是一個常量指標,但是一般的常量指標是不能指向常量的,所以如果要使this指向一個常量物件,必須要把this定義成const classname* const,即指向常量的常量指標。在類成員函式的引數列表之後新增const關鍵字,就相當於把this定義成const classname* const,只有這樣常量物件才能呼叫這個函式。

一些總結:

1)const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員;

2)非const成員函式可以訪問非const物件的非const資料成員、const資料成員,但不可以訪問const物件的任意資料成員;

3)常量物件只能呼叫常量成員函式;非常量物件可以呼叫常量成員函式,當const版本和非const版本的成員函式同時出現時,非const物件呼叫非const成員函式。

4)作為一種良好的程式設計風格,在宣告一個成員函式時,若該成員函式並不對資料成員進行修改操作,應儘可能將該成員函式宣告為const 成員函式。

5)引用/指向一個常量,必須使用對常量的引用/指向常量的指標。但對常量的引用/指向常量的指標可以引用/指向非常量。

本部落格參考了很多來自@cthon 的博文內容,十分感謝。

C const 限定符

c const 限定符 作用 把一個物件轉換成一個常量 用法 const type name value 性質 1 定義時必須初始化,定義後不能被修改。 2 類中的const成員變數必須通過初始化列表進行初始化。 3 非const變數預設為extern。要使const變數能在其他檔案中訪問,必須顯示...

const 限定符

使用 const 可以定義一類值無法被改變的變數。const 物件建立後無法被改變,所以必須要進行初始化。 const int bufsiz...

C C const限定符總結

const是一種限定符,被const所限定的變數其值不可以被改變。 由於const一旦建立其值就不能夠被改變,所以我們必須對其進行初始化 c...