1、為什麼盡可能使用const?
const指定語義約束,即某個物件不應該被改變,並且編譯器會強制執行這條約束。如果某個物件確實不應該被改變,那麼我們就應該將其生命為const,這樣一來,如果違背了這個約束,編譯器將幫助我們檢測出來。
2、界定常量指標和指向常量的指標
const type * pt;
//(1)
type const
*pt;
//(2)
type*
const pt;
//(3)
(1)和 (2) 表達的意思是一樣的,即指向常量的指標。而(3) 表示常量指標。也就是二者的界定點在與constzai星號前還是後,跟型別前後無關。
3、迭代器與指標的關係
迭代器是由指標塑模出來的,因此迭代器的作用就相當於是乙個t*型別的指標,如果迭代器指向不可改變的資料:
const std::vector<
int>
::iterator iter;
如果表達迭代器不可改變指向(自身為const):
std::vector<
int>
::const_iterator iter;
4、const與函式宣告式
const的最大威力便對函式宣告時的應用,在乙個函式宣告式內,const可以和:函式返回值、各個引數、函式自身產生關聯。
5、const 與函式返回值
令函式返回乙個常量值往往可以減少錯誤。
例如:過載乘號時(*):
const rational operator*(
const rational& lhs,
const rational& rhs)
rational a,b,c;
(a*b)
=c;
如果符號函式的返回值不是const的,那麼執行:
(a*b)
=c;
時將會導致錯誤,這相相當於對兩個數的乘積的結果做賦值。
再例如:
if
(a*b=c)
;//本來想寫成a*b==c
如果a、b是內建型別,這樣的結果直接就是錯誤的。自定義型別應該更好的內建型別相容,因此對兩個數的乘積做賦值也應該表達為非法。而將返回值設定為const就可以表達出這種非法效果,讓編譯器識別出來。
6、const成員函式
(1)const成員函式的有兩個重要作用:
(2)同簽名的const函式與non-const成員函式的關係
const成員函式與non-const成員函式構成過載關係,這一點非常重要。當函式傳遞的是乙個const物件時,呼叫const成員函式,如果沒有這樣的成員函式就會報錯。當函式傳遞的是乙個non-const物件時,呼叫non-const成員函式,如果沒有這樣的成員函式就會報錯。
(3)成員函式宣告為const意味著什麼?
有兩個派別: 和logical constness
編譯器執行的是bitwise constness ,但是我們在程式設計時,應該使用logical constness。
(4)避免同簽名 const成員函式和non-const成員函式**重複
有些時候,const函式和non-const的**一樣,但是乙個為const函式,乙個為non-const函式。如果這時分別寫兩個函式的話,顯然造成了**重複問題。
這時我們應該考慮實現函式一次,但是使用它兩次。也就是說,必須令其中乙個呼叫另乙個。一般使用non-const 呼叫const版本來避免**重複問題,並且在充當non-const使用時,應該將函式轉換為const的。不能使用const來呼叫non-const來解決上述問題。
條款03 盡可能使用const
use const whenever possible.stl迭代器是根據指標塑模出來的,所以迭代器的作用就像個t 指標。宣告迭代器為const就像宣告指標為const一樣,表示這個迭代器不能指向不同的東西,但它所指的東西的值是可以改變的。如果你希望迭代器所指的東西不可被改動,你需要的是const ...
條款03 盡可能使用const
被指物是常量時,const寫在型別前或型別後都行 const widget buf widget const buf stl迭代器是以指標為根據塑模出來,所以迭代器的作用就像個t 指標。std vectorv const std vector iterator it v.begin it 10 正確...
條款03 盡可能使用const
總結關鍵字const出現在星號左邊,表示被指物是常量 如果出現在出現在星號右邊,表示指標自身是常量 如果出現在星號兩邊,表示被指物和指標兩者都是常量。const char p greeting 指標所指物為常量 char const p greeting 指標是常量stl迭代器是以指標為根據塑模出來...