條款03 盡可能使用const

2022-01-24 03:30:50 字數 2064 閱讀 2026

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迭代器是以指標為根據塑模出來...