const常量相對與宏常量優勢:
const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查,並且在字符替換時可能會產生意料不到的錯誤。
常見的const用法:
常變量: const 類型說明符 變量名
常數組: const 類型說明符 數組名[大小]
常指針: const 類型說明符* 指針名 ,類型說明符* const 指針名
常引用: const 類型說明符 &引用名
常對象: const 類名 對象名
常量成員函數: 類名::fun(形參) const
常變量:
取代了C中的宏定義,聲明時必須進行初始化。
const int a=10;
常數組:
const int a[3]={1,2,3};//定義一個常數組,則不能通過a[0]=0形式對數組元素賦值
但通過const聲明的常量變量只能保證不通過變量名修改變量的值,但可以通過其他方式修改變量所在內存的內容,比如指針。
int main(){
const int a[3] = { 1,2,3 };
int* p;
p = (int*)a;
*p = 0;
cout << a[0] << endl;//此時a[0]輸出為0
}
常指針的兩種含義:
使用指針時涉及到兩個對象:該指針本身和被它所指的對象。
①char *const p; //p為指針常量,即指針為常量不能改變,指針指向的內容可改變
void func(int* const p){
int *pi = new int(100);
p = pi;//錯誤!P是指針常量。不能對它賦值。
}
int main()
{
int* p = new int(10);
func(p);
delete p;
return 0;
}
②char const *p1; //p1為常量指針,即指針指向內容為常量不可改變,指針可改變
void func(int const *p)
{
*p = 8;//錯誤!*P是常量,不能對它進行改變。
}
int main()
{
int* p = new int(10);
func(p);
delete p;
return 0;
}
常量與引用:
void func(const int& i)
{
i = 100; // 錯誤,不能通過該引用改變對應內存的內容
}
int main()
{
int i = 10;
func(i);
return 0;
}
如果不希望函數的調用者改變參數的值,應該使用引用。
常量成員函數:
常量函數是C++對常量的一個擴展,它很好的確保了C++中類的封裝性。在C++中,為了防止類的數據成員被非法訪問,將類的成員函數分成了兩類,一類是常量成員函數(也被稱為觀察者);另一類是非常量成員函數(也被成為變異者)。在一個函數的簽名后面加上關鍵字const后該函數就成了常量函數。對於常量函數,最關鍵的不同是__編譯器不允許其修改類的數據成員__。例如:
class Test
{
public:
void func() const;
private:
int intValue;
};
void Test::func() const
{
intValue = 100;//錯誤,不能修改類的數據成員
}
上面的代碼中,常量函數func函數內試圖去改變數據成員intValue的值,因此將在編譯的時候引發異常,這大大提高了程序的健壯性。