C 之const限定符

2021-08-02 19:07:32 字數 3421 閱讀 6811

const的特點:

- 用const加以限定的變數,無法改變。

- 由於const物件定義之後就無法改變,所以必須對其進行初始化。

- const物件的常量特徵僅在嘗試改變它的時候表現出來,其他時候和變數無異。

const初始化:

const

int bufsize = 512; //bufsize無法再改變

const物件通常只在本檔案內有效,如果希望其在其他檔案中也有效,則需要在其前面加上extern關鍵字。更詳細的做法是,在乙個檔案中定義const,在其他多個檔案中宣告並使用它。

extern

const

int bufsize = 512;

首先,const是乙個限定符,被它修飾的變數的值不能改變。對於一般的變數來說,其實沒有頂層const和底層const的區別,而只有對於指標這類復合型別的基本變數,才有這樣的區別。

如何區分頂層const和底層const?

頂層const表示指標本身是個常量;

底層const表示指標所指向的物件是個常量。

指標如果新增const修飾符時有兩種情況:

- 指向常量的指標:代表不能改變其指向內容的指標。宣告時const可以放在型別名前後都可,拿int型別來說,宣告時:const int和int const 是等價的。宣告指向常量的指標也就是底層const,下面舉乙個例子:

int num_a = 1;

intconst *p_a = &num_a; //等價於const int *p_a = &num_a,指向const int 型別的指標,是底層const

//*p_a = 2; //錯誤,指向「常量」的指標不能改變所指的物件

注意:指向「常量」的指標不代表它所指向的內容一定是常量,只是代表不能通過解引用符(操作符*)來改變它所指向的內容。

上例中指標p_a指向的內容就不是常量,可以通過賦值語句:num_a=2; 來改變它所指向的內容。

- 常量指標:代表指標本身是常量,宣告時必須初始化,之後它儲存的位址值就不能再改變。宣告時const必須放在指標符號*後面,即:*const 。宣告常量指標就是頂層const,下面舉乙個例子:

int num_b = 2;  

int *const p_b = &num_b; //指向int型別的const指標,是頂層const

//p_b = &num_a; //錯誤,常量指標不能改變儲存的位址值

其實頂層const和底層const很簡單,乙個指標本身新增const限定符就是頂層const,而指標所指的物件新增const限定符就是底層const。

區分頂層const和底層const的作用

為啥非要區分頂層const和底層const呢,根據c++primer的解釋,區分後有兩個作用。

1 執行物件拷貝時有限制,常量的底層const不能賦值給非常量的底層const。也就是說,你只要能正確區分頂層const和底層const,你就能避免這樣的賦值錯誤。下面舉乙個例子:

int num_c = 3;  

const

int *p_c = &num_c; //指向const int的指標,是底層指標

//int *p_d = p_c; //錯誤,不能將底層const指標賦值給非頂層const指標

const

int *p_d = p_c; //正確,都是指向const int的指標

2 使用命名的強制型別轉換函式const_cast時,需要能夠分辨底層const和頂層const,因為const_cast只能改變運算物件的底層const。下面舉乙個例子:

int num_e = 4;  

const

int *p_e = &num_e;

//*p_e = 5; //錯誤,不能改變底層const指標指向的內容

int *p_f = const_cast

(p_e); //正確,const_cast可以改變運算物件的底層const。但是使用時一定要知道num_e不是const的型別。

*p_f = 5; //正確,非頂層const指標可以改變指向的內容

cout

<< num_e; //輸出5

3練習

說了這麼多,應該練習一下,const int const*const pppi 是頂層const還是底層const?

答案當然是底層const,因為int前面const限定符,而最後乙個*後面沒有const限定符。看最後乙個例子:

const

int a = 1; //a是頂層const

//int * pi = &a; //錯誤,&a是底層const,不能賦值給非底層const

const

int * pi = &a; //正確,&a是底層const,可以賦值給底層const

const

int *const *const ppi = &pi //即是底層const,也是頂層const

const

int *const *const *pppi = &ppi; //底層const

指標和const限定符(另一版本理解方法)

- 指向const物件的指標

- const指標

- 指向const物件的const指標

const

double *p;// 指向const double型別的指標

double *const p = π //指向double物件的const指標

const

double *const p = π//指向const物件的const指標

下面看幾個例子:

指向const物件的指標

#include

using

namespace

std;

int main()

const指標

指向const物件的const指標

#include

using

namespace

std;

int main()

const寫在左邊也行,寫在右邊也行。

const

string str1;

string

const str2;

上面的兩種寫法都是對的。

參考:

c++ primer 第五版

C 的const限定符

const限定符總是讓人很頭疼,下面講解一下幾個比較容易混淆的概念 對常量的引用 常量引用 一般情況下,引用的型別要與其所引用的物件的型別一致,其中的例外情況就是,當初始化常量引用時,允許用任意表示式作為初始值,只要改表示式能轉換成引用的型別即可。const int i 1 const int ri...

C 的const限定符

一 const常量 const int a 123 編譯時初始化 const int a get size 執行時初始化 a 111 錯誤,a是常量物件,不能改變了 const int b 錯誤 二 對const和const引用的初始化 初始化常量或常量引用時允許用任意表示式作為初始值,只要該表示式...

關於const 限定符

很多引用自c primer一書 比如有時候需要將乙個文字中的資料複製到另外乙個文字。我們需要使用緩衝區,緩衝區的大寫我們可以自己來決定比如1024個位元組,這是乙個常量,我們使用bufsize 1024.但是bufersize物件本身是乙個變數。所以我們可以引入const限定符,它將乙個物件轉化為常...