const是一個C++語言的限定符,它限定一個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性。下面是小編分享的c++中const關鍵字,一起來看一下吧。
define與const的區別
ne作用在預處理時,是簡單地字元替換
2. const作用在編譯時,具有型別檢查的功能
3. const必須進行初始化
常量指標與指標常量
#include <iostream>
using std::endl;
using std::cout;
int main()
{
int a = 100;
const int *pa = &a;
int * const pb = &a;
return 0;
}
小結:
const int *pa = &a;-->常量指標
可以改變指標指向,不能改變所指變數的值。
int * const pb = &a;
不能改變指標指向,可以改變所指變數的值。
C/C++中CONST用法總結
1、修飾常量時:
const int temp1; //temp1為常量,不可變
int const temp2; //temp2為常量,不可變
2、修飾指標時:
主要看const在*的前後,在前則指標指向的內容為常量,在後則指標本身為常量;
const int *ptr; //*ptr為常量;
int const *ptr; //*ptr為常量;
int* const ptr; //ptr為常量;
const int * const ptr; //*ptr、ptr均為常量;
3、const修飾類物件時:
const修飾類物件時,其物件中的任何成員都不能被修改。const修飾的物件,該物件的任何非const成員函式都不能呼叫該物件,因為任何非const成員函式都會有修改成員變數的可能。
class TEMP{
void func1();
void func2() const;
}
const TEMP temp;
1(); //錯誤;
2(); //正確;
4、const修飾成員變數:
const修飾的成員變數不能被修改,同時只能在初始化列表中被初始化,因為常量只能被初始化,不能被賦值;
賦值是使用新值覆蓋舊值建構函式是先為其開闢空間然後為其賦值,不是初始化;而初始化列表開闢空間和初始化是同時完成的,直接給與一個值,所以const成員變數一定要在初始化列表中完成。
class TEMP{
const int val;
TEMP(int x)val(x){}; //只能在初始化列表中賦值;
}
5、const修飾類的成員函式
const成員函式表示該成員函式不能修改類物件中的任何非const成員變數。一般const寫在函式的後面,形如:void func() const;
如果某個成員函式不會修改成員變數,那麼最好將其宣告為const,因為const成員函式不會對資料進行修改,如果修改,編譯器將會報錯;
class TEMP{
void func()const; //常成員函式,不能修改物件中的成員變數,也不能呼叫類中任何非const成員函式;
}
對於const類物件,只能呼叫類中的const成員函式,所以const修飾成員函式的作用主要就是限制對const物件的使用。
6、const在函式宣告中的使用:
在函式宣告中,const可以修飾函式的返回值,也可以修飾具體某一個形參;
修飾形參時,用相應的變數初始化const常量,在函式體內,按照const所修飾的部分進行常量化;
修飾函式返回值時,一般情況下,const修飾返回值多用於操作符的過載。通常不建議用const修飾函式的返回值型別為某個物件或某個物件引用的情況;
7、const常量與define巨集定義的區別:
1)處理階段不同:
define是在預處理階段,define常量從未被編譯器看見,因為在預處理截斷就已經替換了;
const常量在編譯階段使用。
2)型別和安全檢查不同
define沒有型別,不做任何檢查,僅僅是字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤
const常量有明確的型別,在編譯階段會進行型別檢查;
3)儲存方式不同
define是字元替換,有多少地方使用,就會替換多少次,不會分配記憶體;
編譯器通常不會為const常量分配空間,只是將它們儲存在符號表內,使他們成為一個編譯期間的一個常量,沒有讀取記憶體的操作,效率也很高;
8、mutable關鍵字:
在C++中,mutable是為了突破const的限制而設定的。被mutable修飾的`變數,將永遠處於可變的狀態,即使在一個const函式中,甚至結構體變數或者類物件為const,其mutable成員也可以被修改:
class ST {
public:
int a;
mutable int showCount;
void Show()const;
};
void ST::Show()const{
//a=1;//錯誤,不能在const成員函式中修改普通變數
showCount++;//正確
}
mutable只能修飾非靜態資料成員;
9、const_cast:
用於修改型別的const或volatile屬性。
用法:
:const_cast<type_id> (expression)
該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。
1)常量指標被轉化成非常量的指標,並且仍然指向原來的物件;
2)常量引用被轉換成非常量的引用,並且仍然指向原來的物件;
3)const_cast一般用於修改底指標。如const char *p形式。
建議:
1、應該儘可能使用const,它會允許你指定一個語義約束(也就是指定一個不能被改動的物件),而編譯器會強制實施這項約束。它允許你告訴編譯器和其他程式設計師某值應該保持不變。
2、將某些東西宣告為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的物件、函式引數、函式返回型別、成員函式本體;
3、編譯器強制實施bitwise constness,但你編寫程式時應該使用“概念上的常量性”(conceptual constness);
4、當const和non_const成員函式有著實質等價的實現時,令non-const版本呼叫const版本可避免程式碼重複;