盡可能使用const
(1)const約束指針、迭代器
const char* p = "adc"; //non-const pointer,const data char* const p = "abc"; //const pointer,non-const data const char* const p = "abc";//const pointer,const data const std::vector::iterator it = vec.begin();//(it的類型為 T* const)const pointer std::vector ::const_iterator it = vec.begin();//const data
void a(const T b);//保護形參不被修改 void a(const T* b);//const pointer void a(const T& b);//const reference另外只有引用的const傳遞可以傳遞一個臨時對象,因為臨時對象都是const屬性, 且是不可見的,他短時間存在一個局部域中,所以不能使用指針,只有引用的const傳遞能夠捕捉到這個家伙
(3)const約束函數返回
const T fun1();//這個其實無意義,因為參數返回本身就是賦值。 const T* fun2();//調用時 const T *pValue = fun2(); //我們可以把fun2()看作成一個變量,即指針內容不可變。 T* const fun3(); //調用時 T* const pValue = fun2(); //我們可以把fun2()看作成一個變量,即指針本身不可變。 //引用類似
(4)const約束類
(1)const修飾成員變量 const修飾類的成員函數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。 class A { … const int nValue; //成員常量不能被修改 … A(int x): nValue(x) { } ; //只能在初始化列表中賦值 } (2)const修飾成員函數 const修飾類的成員函數,則該成員函數不能修改類中任何非const成員函數。一般寫在函數的最後來修飾。 class A { … void function()const; //常成員函數, 它不改變對象的成員變量. //也不能調用類中任何非const成員函數。 } 對於const類對象/指針/引用,只能調用類的const成員函數,因此,const修飾成員函數的最重要作用就是限制對於const對象的使用。 a. const成員函數不被允許修改它所在對象的任何一個數據成員。 b. const成員函數能夠訪問對象的const成員,而其他成員函數不可以。 (3)const修飾類對象/對象指針/對象引用 · const修飾類對象表示該對象為常量對象,其中的任何成員都不能被修改。對於對象指針和對象引用也是一樣。 · const修飾的對象,該對象的任何非const成員函數都不能被調用,因為任何非const成員函數會有修改成員變量的企圖。 例如: class AAA { void func1(); void func2() const; } const AAA aObj; aObj.func1(); × aObj.func2(); 正確 const AAA* aObj = new AAA(); aObj-> func1(); × aObj-> func2(); 正確
要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
要避免最一般的賦值操作錯誤,如將const變量賦值,具體可見思考題;
在參數中使用const應該使用引用或指針,而不是一般的對象實例,原因同上;
const在成員函數中的三種用法(參數、返回值、函數)要很好的使用;
形參為指針或者引用時最好使用const,避免形參為常量不能使用
不要輕易的將函數的返回值類型定為const;
除了重載操作符外一般不要將返回值類型定為對某個對象的const引用;
任何不會修改數據成員的函數都應該聲明為const 類型。