1. 程式人生 > >條款三:儘可能使用const

條款三:儘可能使用const

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版本,這樣就避免程式碼重複了。