C 中 const 和 constexpr特性

2021-10-05 22:52:00 字數 1414 閱讀 5495

const 是乙個關鍵字修飾符,用於修飾常量,說明變數是不可改變的常量,一經定義賦值不可改變。

const 修飾的變數具有以下特點:

const 常量只能在宣告的時候賦值。

如果乙個類內的成員變數被宣告為const 常量,則該成員變數必須使用初始化列表的方式進行初始化。

const 修飾指標變數是規則有點特別:

如果const 在*的右邊,則const修飾的指標變數。

int b =

8; int

*const a =

&b;//說明修飾的是int型別的指標變數a,指標變數a的值不被改變,但是指標變數a所指向的記憶體中的值是可以改變的

//也就是可以對指標變數a所指向的記憶體進行賦值

*a =10;

//這是b的值變成了10,*a的值是10,他們代表同乙個記憶體空間

如果const在*的左邊,則說明const修飾的是指標所指向的記憶體空間,這個記憶體空間是常量不能被改變的。
int b =8;

const

int*a =

&b;//指標變數a的值可以被改變,也就是指標變數a可以別重新賦值,但是目前指標變數a所指向的記憶體空間不能被賦予新的值,不能通過指正變數a改變這個記憶體空間的值,這個記憶體空間的值課通過變數b來重新賦值改變

constexpr 表示常量表示式,所謂常量表示式是指值不會發生改變的表示式,並且在編譯的過程中能夠得到計算結果的表示式。我們知道的常量表達是有哪些?const 物件屬於常量表示式,數字、字元等字面值屬於常量表示式。

constexpr 是c++ 11 新引入的關鍵字,他規定,允許將變數宣告為constexpr 以便由編譯器來驗證變數的值是否是乙個常量表示式。申明為constexpr 的變數一定是乙個常量,而且必須用常量表示式進行初始化,否則無法編譯通過。

const

int b =10;

int c =8;

constexpr int exc = c;

//無法通過編譯,因為c是變數,不是常量表示式

constexpr int a = b;

//ok

如果constexpr 修飾指標,那麼constexpr 修飾作用只對指標有效,而對指標所指向的記憶體空間無效。
constexpr int b =10;

int c =5;

constexpr int

*a =

&b;// a是常量指標,指向整形常量b

constexpr int

*d =

&c;// d是常量指標,指向整數c

C 中頂層const和底層const

指標本身是乙個物件,由於,指標實際相應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,因此,指標是乙個常量與指標所指向的是乙個常量是兩個全然不同的概念,頂層 const 表示的是 指標本身是乙個常量,底層 const 表示的是 指標所指的物件是乙個常量,更普通情況下,頂層 const...

C 中頂層const和底層const

頂層const表示指標本身是個常量,底層const表示指標所指的物件是乙個常量。int i 0 int const p1 i 不能改變p的值,p是乙個指標,所以p是乙個頂層const const int p2 i 表示不能改變指標所指i的值,所以是乙個底層const const的頂層和底層不只是限定...

c 中const和引用

c 和c語言裡面的const 1 在c語言裡面的const修飾的量是乙個常變數,不能作為左值,但是可以通過洩露指標和引用去修改它,int a 10 int p a 洩露了常量的引用。但是 int a 10 const int p a 是正確的。因為a本來就是普通的變數,而通過常量 p不能改變它,但a...