const關鍵字的用法,在C++程式設計中要儘可能用const
阿新 • • 發佈:2018-12-14
為什麼說在C++程式設計中要儘可能用const呢?
因為這樣可以獲得編譯器的幫助,以便寫出健壯性的程式碼。
C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程式設計師告訴編譯器某值是保持不變的。如果在程式設計中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。
1.const 修飾成員變數
#include<iostream> using namespace std; int main(){ int a1=6; ///non-const data const int a2=a1; ///const data int * a3 = &a1; ///non-const data,non-const pointer const int * a4 = &a1; ///const data,non-const pointer int * const a5 = &a1; ///non-const data,const pointer int const * const a6 = &a1; ///const data,const pointer const int * const a7 = &a1; ///const data,const pointer return 0; }
const修飾指標變數時:(劃重點,這是經常會混淆的地方)
(1)只有一個const,如果const位於*左側,表示指標所指資料是常量,不能通過解引用修改該資料;指標本身是變數,可以指向其他的記憶體單元。
(2)只有一個const,如果const位於*右側,表示指標本身是常量,不能指向其他記憶體地址;指標所指的資料可以通過解引用修改。
(3)兩個const,*左右各一個,表示指標和指標所指資料都不能修改。
2.const修飾函式引數
void testModifyConst(const int _x) {
_x=9; ///編譯出錯
}
傳遞過來的引數在函式內不可以改變,與上面修飾變數時的性質一樣。
3.const修飾成員函式
#include <iostream> using namespace std; class Point{ public : Point(int _x):x(_x){} void testConstFunction(int _x) const{ ///錯誤,在const成員函式中,不能修改任何類成員變數 x=_x; ///錯誤,const成員函式不能呼叫非onst成員函式,因為非const成員函式可以會修改成員變數 modify_x(_x); } void modify_x(int _x){ x=_x; } int x; };
(1)const修飾的成員函式不能修改任何的成員變數(mutable修飾的變數除外)
(2)const成員函式不能呼叫非onst成員函式,因為非const成員函式可以會修改成員變數
4.const修飾函式返回值
(1)指標傳遞
如果返回const data,non-const pointer,返回值也必須賦給const data,non-const pointer。因為指標指向的資料是常量不能修改。
const int * mallocA(){ ///const data,non-const pointer
int *a=new int(2);
return a;
}
int main()
{
const int *a = mallocA();
///int *b = mallocA(); ///編譯錯誤
return 0;
}
(2)值傳遞
如果函式返回值採用“值傳遞方式”,由於函式會把返回值複製到外部臨時的儲存單元中,加const 修飾沒有任何價值。所以,對於值傳遞來說,加const沒有太多意義。不要把函式int GetInt(void) 寫成const int GetInt(void);不要把函式A GetA(void) 寫成const A GetA(void),其中A 為使用者自定義的資料型別。