條款三:儘可能使用const
阿新 • • 發佈:2018-12-14
1.定義變數時使用const
char greeting[]="Hello";
char* p=greeting;//non-const pointer,non-const data
const char* p=greeting;//non-const pointer,const data
char* const p=greeting;//const pointer,non-const data
const char* const p=greeting;//const pointer,const data
如果關鍵字const出現在星號左邊,表示被指物為常量;如果出現在星號右邊,表示指標自身是常量;如果出現在星號兩邊,表示被指物和指標都是常量。
2.STL迭代器的const使用 宣告迭代器為const 就像宣告指標為const一樣(即T* const指標),如果希望迭代器所指向的東西不可改動,我們需要const_iterator;
std::vector<int>vec; const std::vector<int>iterator iter=vec.begin();//iter的作用像個T* const *iter=10;//沒問題,改變iter所指物 ++iter;//錯誤!iter是const std::vector<int>::const_iterator cIter=vec.begin();//cIter的作用像個const T* *cIter=10;//錯誤,*cIter是const ++cIter;//沒問題,改變cIter.
3.另返回值為一個常量 為避免如下錯誤的產生:
(a*b)=c;
if(a*b=c);
如果返回值為常量,則上述兩種錯誤都能檢測出來
4.const成員函式 成員函式如果是const意味著該函式不可以改變任何物件內,任何non-static成員變數(bitwise陣營的人相信)。
必須得改變怎麼辦? 利用C++的一個與const相關的擺動場:mutable(可變的)。mutable釋放掉non-static成員變數的bitwise constness約束;
5.在const和non-const成員中避免重複 一般我們對operator[]的實現會有兩個版本一個是常量版本,一個是非常亮版本,常量版本專門對常量進行處理,非常亮對非常量進行處理,因為非常量版本不能保證不修改常量所以是不能對常量進行處理的,但是這兩種實現的大部分程式碼會發生重合,這時我們該怎麼辦呢?
class K
{
public:
...
const char& operator[](std::size_t position) const
{
...
...
...
return text[position];
}
char& operator[](std::size_t position)
{
return
const_cast<char&>(static_cast<const K&>(*this)[position]);
}
}
以上的套路很簡單,就是先強制給物件加上const屬性然後呼叫const版本的[]然後將返回值強制轉換成非const版本,這樣就避免程式碼重複了。