對於const修飾符的總結

2021-09-17 18:34:16 字數 2369 閱讀 8734

例如:

const int a = 10;

這將使得a的值為乙個常量,後面無法改變,需要注意 使用const修飾的變數必須被初始化const int a;

這樣的**會使得編譯失敗。

int a = 10;

const int &b = a;

使用const修飾的引用將無法改變引用物件的值,即類似

b = 5;
這樣的**會使得編譯失敗。

所以這樣的引用方式常常可以用在函式形參中,來保證函式內部只能對物件進行「讀」操作而無法進行「寫」操作。舉個例子

inline int max(const int &a,const int &b)

上述**會使得編譯失敗,因為嘗試改變被const修飾的引用物件的值。

最常見的例子,

int a = 10;

int *const p1 = &a;

const int *p2 = &a;

分別闡述兩個const的作用,

講講區分方式:從右往左讀,第乙個const修飾的是p1,

第二個const修飾的是 整個(int *p2)。

第乙個const的作用:修飾p,表示指標p1的值本身是乙個常量,無法被改變,即類似

int b = 20;

p1 = &b;

這樣的**是錯誤的,因為p1被const修飾後,值無法改變。但是

*p1 = 15;
這行**沒有錯。

第二個const的作用:修飾整個(int * p2),表示p2指標指向的物件的值無法被改變,是乙個指向常量的指標,即

*p2 = 15;
這行**是錯誤的,但是

int b = 20;

p2 = &b;

這樣的**沒有錯

所謂頂層const 是指 變數本身的值不可變,那這個const就是乙個頂層const

底層const值 指標變數指向的物件不可變,那這個const為乙個底層const

int a = 10;

int *const p1 = &a;//這個是底層const

const int *p2 = &a;//這個是頂層const

constexpr也是乙個修飾符,用於表示要修飾的變數變成乙個常量表示式

constexpr int a = 10;這樣的常量表示式需要滿足的要求是程式在編譯過程就可以 get到這個變數的值,而不是在執行階段才能get到。例如

srand(time(0));

constexpr int a = rand();

就會使得編譯失敗,因為rand函式在執行階段才能獲得返回值,a才能被初始化。

int a = 10;

constxpr int *p1 = &a;

const int *p2 = &a;

這兩行**看起來類似,但是事實上p1和p2的型別是不同的。

從上文的描述中可以獲知得const int *p2 = &a;中的const是乙個底層const,表示指向的物件的值無法被改變,是乙個指向常量的指標。

constxpr int *p1 = &a;則表示 p1 本身 是乙個常量,無法改變,也就相當於乙個 頂層const。

可以在類中成員函式宣告的最後加上const修飾符,作用是使得該成員函式 無法對類中的物件的值進行改變。

templateclass stack
如上面的例子中,這是乙個stack類資料結構的宣告,其中成員函式 pop 和 push 的作用是往棧中新增、刪除元素,這就會對類中的elems物件就行改變,所以沒有用const修飾;而top函式和empty函式只是簡單的返回頭元素 和 判斷是否為空,並沒有對物件進行改變,所以加了const修飾。

1)const定義的常量有型別,#define定義的沒有型別。

編譯時可以對前者進行型別安全檢查,而後者僅僅是簡單的文字替換。

2)const定義的常量在編譯時分配記憶體,只展開一次。

#define定義的常量是在預編譯時進行替換,不分配記憶體,但是在編譯過程中會多次展開,浪費資源。

3)作用域不同,const定義的作用域為該變數的作用域範圍。而#define定義的常量

作用域為它的點到程式結束,當然也可以在某個地方用#undef取消。

C C 中const修飾符總結

c c 中的const是乙個修飾符,它允許你指定乙個語義上的約束,也就是可以通過const指定乙個 不該被改動 的物件,而編譯器會強制實施這項約束。const語法很多 但都不複雜 下面我將分別講述各種語法及其作用。在講述const修飾符用在指標上有什麼效果之前先來看下指標不加const修飾符的情況 ...

const 型別修飾符

const是用來限定所指定的變數或者函式不可作修改。1 修飾變數 當const用來修飾變數的時候,const所指定部分不可修改。a.修飾常規變數 如 const int a 10 int const a 10 這兩種方式的效果一樣,都是將a描述為常量,a的值在被賦初值後不可以修改。但是這和由巨集定義...

const修飾符 小結

1.const 和extern 預設狀態下const物件僅在檔案內有效 當編譯器以初始化的方式定義乙個const物件時,編譯器將在編譯過程中吧用到該變數的地方都替換成對應的值,為了執行上述替換,編譯器必須知道變數的初始值,所以通常const的有效域就在本檔案 為了能在其他檔案中使用該const變數 ...