C++中const的應用


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的值,因此將在編譯的時候引發異常,這大大提高了程序的健壯性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM