const關鍵字用於表示變數或函式, 亦或其他型別的資料其值或其本身的值禁止被修改.
但需要注意的是, 即使被修飾為const型別的變數, 其本質依舊是個變數, 而不是常量.
也許你會說, 這有什麼區別呢? 我在**中感覺不出差別啊. 其實它們的差別在於編譯器的編譯. 對於編譯器來說, 變數意味著需要分配記憶體空間, 而常量只是在編譯期間記錄在編譯器的一張記憶體表裡面的乙個證整數而已. 變數的值必須初始化, 除非使用extern修飾它, 這就告訴編譯器該變數是乙個全域性const變數, 在**定義編譯器暫時不知道, 所以允許它在其他地方定義其值, 一旦定義好後就禁止再次修改了.
比較複雜的情況, const修飾變數意外的情況:
1. char * const x = "diamond"; // x 禁止修改, 但是*(x)可以被修改: *x = "kongdom"; ok | x++; error!!!
2. const char *s = "diamond"; // *(s) 禁止修改, 也就是該字串禁止被修改: *s = "kingdom"; error!!! | s++; ok
3. person p_01;
const person *p = &p_01; // 物件是const
person const *p = &p_01; // 物件是const
person *const p = &p_01; // 指標是const
const person *const p = &p_01; // 物件和指標都是const
那麼到底什麼情況下建議使用const呢?
1. 修飾函式引數:
大家都知道在c++的函式傳參中, 有值傳遞, 引用傳遞和指標傳遞三種形式. 當使用後兩者進行引數傳遞時, 函式被呼叫後, 實參的值會被函式內部的操作修改, 那麼如果不需要修改呢, 是不是傳引用和指標就無法搬到了呢? 答案當然是否定的, 這個時候你只需在函式引數列表中使用const來修飾變數就可以了.例如:
void func_01(const int *x); // 這裡編譯器將禁止修改傳進函式中的, 這個指標所指向的記憶體空間中的值
int a = 100;
func(&a); // 將a壓棧
const int b = a; // 將a的值放入b中
func(&b); // 將b壓棧
b = a++ // error! b的值禁止被修改
void func_02(const int i)
2. 修飾成員函
這意味著this是const
int get_age() const;
int student::set_age(int age)
int student::get_age() const
3. 修飾類的物件
物件裡面的值禁止修改
4. 關於函式過載
設: 某class student內有如下成員函式:
void func();
void func() const;
且: 在main()函式中有:
const student stu;
stu.func();
則: 以上兩個函式構成函式過載, 可以實現靜態多型.
也許你會問, 這兩個函式應該是被重複定義了啊, 應該是錯誤的. 它們無法構成函式過載. 但實際上不是這樣的.
這裡的兩個func()函式, 都屬於類的成員函式, 而它們實際上是這樣的:
void func(student *this);
void func(const student *this);
也就是說, 第二個func()函式的修飾符const, 是用來修飾類的物件本身的, 也就是this
當const 型別的物件 stu, 呼叫func()函式時, 就會去呼叫同樣是const型別的那個func() const函式.
關於const關鍵字
const es6新增關鍵字,用於宣告建立乙個值的唯讀引用。我們都知道,const一般用來定義常量,在宣告的時候需要賦初始值,而且初始值一旦賦值,便不能改變。但是以上說的是針對於基本型別資料的定義,對於引用型別的定義,不可變的是const繫結的指標,而它的屬性可以任意修改。說人話 如果我用const...
C中const關鍵字
const 用法 定義常量,修飾指標 函式的輸入引數和返回值,把定義或者修飾的變數屬性設為唯讀。本質上它只是在全域性資料段或者棧中定義的是乙個唯讀的常量,不是真正位於字串常量區。所以關鍵字const 並不能把變數變成真正的常量,事實上還是可以改變 const 定義的變數的值。const 的目的是為了...
C 中const關鍵字
一 const修飾指標變數 int num 0 1.const在 前面,表示const修飾指標指向的內容 const int p intconst p 2.const在 後面,表示const修飾指標變數 int const p 二 const修飾成員函式首先來看一下普通成員函式 class a fu...