C 型別中的const

2021-03-31 08:56:58 字數 2900 閱讀 5663

常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的。因此,定義或說明常型別時必須進行初始化。

一般常量和物件常量

1. 一般常量

一般常量是指簡單型別的常量。這種常量在定義時,修飾符const可以用在型別說明符前,也可以用在型別說明符後。如:

int const x=2;

或const int x=2;

定義或說明乙個常陣列可採用如下格式:

《型別說明符》 const 《陣列名》[《大小》]…

或者const 《型別說明符》 《陣列名》[《大小》]…

例如:int const a[5]=;

2. 常物件

常物件是指物件常量,定義格式如下:

《類名》 const 《物件名》

或者const 《類名》 《物件名》

定義常物件時,同樣要進行初始化,並且該物件不能再被更新,修飾符const可以放在類名後面,也可以放在類名前面。

常指標和常引用

1. 常指標

使用const修飾指標時,由於const的位置不同,而含意不同。下面舉兩個例子,說明它們的區別。

下面定義的乙個指向字串的常量指標:

char * const prt1 = stringprt1;

其中,ptr1是乙個常量指標。因此,下面賦值是非法的。

ptr1 = stringprt2;

而下面的賦值是合法的:

*ptr1 = "m";

因為指標ptr1所指向的變數是可以更新的,不可更新的是常量指標ptr1所指的方向(別的字串)。

下面定義了乙個指向字串常量的指標:

const * ptr2 = stringprt1;

其中,ptr2是乙個指向字串常量的指標。ptr2所指向的字串不能更新的,而ptr2是可以更新的。因此,

*ptr2 = "x";

是非法的,而:

ptr2 = stringptr2;

是合法的。

所以,在使用const修飾指標時,應該注意const的位置。定義乙個指向字串的指標常量和定義乙個指向字串常量的指標時,const修飾符的位置不同,前者const放在*和指標名之間,後者const放在型別說明符前。

2. 常引用

使用const修飾符也可以說明引用,被說明的引用為常引用,該引用所引用的物件不能被更新。其定義格式如下:

const 《型別說明符》 & 《引用名》

例如:const double & v;

在實際應用中,常指標和常引用往往用來作函式的形參,這樣的引數稱為常引數。

在c++物件導向的程式設計中,指標和引用使用得較多,其中使用const修飾的常指標和常引用用得更多。使用常引數則表明該函式不會更新某個引數所指向或所引用的物件,這樣,在引數傳遞過程中就不需要執行拷貝初始化建構函式,這將會改善程式的執行效率。

下面舉一例子說明常指標作函式引數的作法。

#include

const int n = 6;

void print(const int *p, int n);

void main()

void print(const int *p, int n)

"<

}

常成員函式

使用const關鍵字進行說明的成員函式,稱為常成員函式。只有常成員函式才有資格操作常量或常物件,沒有使用const關鍵字說明的成員函式不能用來操作常物件。常成員函式說明格式如下:

《型別說明符》 《函式名》 (《參數列》) const;

其中,const是加在函式說明後面的型別修飾符,它是函式型別的乙個組成部分,因此,在函式實現部分也要帶const關鍵字。下面舉一例子說明常成員函式的特徵。

#include

class r

void print();

void print() const;

private:

int r1, r2;

};

void r::print()

void r::print() const

void main()

該例子的輸出結果為:

5,420;52

該程式的類宣告了兩個成員函式,其型別是不同的(其實就是過載成員函式)。有帶const修飾符的成員函式處理const常量,這也體現出函式過載的特點。

常資料成員

型別修飾符const不僅可以說明成員函式,也可以說明資料成員。

由於const型別物件必須被初始化,並且不能更新,因此,在類中說明了const資料成員時,只能通過成員初始化列表的方式來生成建構函式對資料成員初始化。

下面通過乙個例子講述使用成員初始化列表來生成建構函式。

#include

class a

;

const int a::b=10;

a::a(int i):a(i), r(a)

void a::print()

void main()

該程式的執行結果為:

100:10:100

0:10:0

在該程式中,說明了如下三個常型別資料成員:

const int & r;

const int a;

static const int b;

其中,r是常int型引用,a是常int型變數,b是靜態常int型變數。

程式中對靜態資料成員b進行初始化。

值得注意的是建構函式的格式如下所示:

a(int i):a(i),r(a)

其中,冒號後邊是乙個資料成員初始化列表,它包含兩個初始化項,用逗號進行了分隔,因為資料成員a和r都是常型別的,需要採用初始化格式。

<<":"<<<":"<

<

C 中的 const 型別變數

之前總感覺c c 中有const 限定的變數是個很頭痛的問題,一會兒能夠變。一會兒不能夠變,一會兒把const賦給nonconst,一會兒又把nonconst賦給const,頭都被它搞大了。今天剛好把 c primer 中的相關部分又讀了一遍,所以就把相關的內容寫出來總結一下啦!首先,我們能夠想想為...

c中的const與c 中的const

c中的const是乙個偽唯讀識別符號。include include int main 此時輸出a的值為20,被指標間接的改變了。c 中,const進行了增強,不在是乙個偽識別符號了。const int a 10 int p int a p 20 cout a p endl cout a endl ...

C 中的臨時物件都是const型別

先看 1 include 2 using namespace std 34 class a 56 classb7 10 b a a 11 1213 class b1 publicb14 18 1920 intmain 21上面的 可以編譯通過 gcc和vs2005下均測試通過 但是如果將第16行的c...