盡可能使用const

2022-05-07 02:15:07 字數 2013 閱讀 6103

編譯器可以對其進行靜態資料型別檢查

若你在編寫函式時,並沒有打算改變引數,這是就應該將引數的型別設定為const reference,這樣既可以保證引數的常量性,又提高了傳值的效率

若函式的返回值時const pointer,則返回值不可被直接修改,而且返回值必須賦值給const同種型別

令函式返回乙個常量值,該const為頂層const,編譯器會直接忽視其作用,但有時會降低因使用者的錯誤而造成的意外

1

class

rational {};

2const rational operator*(const rational& lhs, const rational&rhs);34

rational a, b, c;

56 (a * b) = c; //

編譯錯誤

7if ((a * b) = c) //

編譯錯誤

可以保證該成員函式可以作用於const物件身上

兩個成員函式如果只是常量性(constness)不同,可以被過載

bitwise constness

成員函式只有在不更改物件的非靜態成員變數時才可以說是const,即不更改物件內的任何乙個bit,但是有一種特殊情況,類的資料成員為指標,改變指標所指之物並不會改變物件的常量性,可以通過bitwise constness測試

logical constness

類中的某些資料成員的變化並不會影響物件的常量性,而將這些資料成員設為mutable

mutable可以釋放掉non-static成員變數的bitwiss constness約束

例如下面的例子

1

class

textblock 910

char &operator

(std::size_t position)

16private

:17 std::string

text;

18 };

在上面的例子中,兩個都是下標運算子的過載,只是乙個函式是const,作用於const物件,乙個函式是non-const,作用於non-const物件,其他實現細節相同,會導致大量的**重複。有人會說,我可以將邊界檢查,日誌資料訪問和檢驗資料的完整性寫成三個private函式,提供給這兩個下標運算子過載函式的使用,但是這樣並不會解決**重複的問題,你還是重複了一些**,例如函式的呼叫,兩次return語句等。你需要做的是實現一次operator功能,並使用它兩次,也就是說,你必須令其中乙個呼叫另乙個。

你無法使用const operator函式去呼叫non-const operator函式,因為const operator函式可以保證呼叫物件的bitwess constness,也就是說const物件可以放心呼叫,但是const operator去呼叫non-const operator來避免**的重複性,這樣const operator就不會保證呼叫者的常量性,也就失去了const函式的本質,編譯器是不允許的。你的做法也只能用non-const operator去呼叫const operator,詳情請看下面

1

class

textblock210

11char &operator

(std::size_t position)

16private

:17 std::string

text;

18 };

當你用const textblock物件去呼叫下標運算子時,呼叫的是const版本的operator;當你使用non-const textblock物件去呼叫下標運算子時,呼叫的是non-const版本的operator

在non-const 版本的operator中,首先將呼叫的物件強制轉換成const物件,以避免重複遞迴呼叫自己,當呼叫完const版本的operator時,返回的是const char的引用,此時const char的引用指向的char物件本身並不是const,所以你可以用const_cast將其const去掉。

盡可能使用 const

使用 const 的好處在於它允許指定一種語意上的約束 某種物件不能被修改 編譯器具體來實施這種約束。通過 const,你可以通知編譯器和其他程式設計師某個值要保持不變。只要是這種情況,你就要明確地使用 const 因為這樣做就可以借助編譯器的幫助確保這種約束不被破壞。對指標來說,可以指定指標本身為...

盡可能使用const

const定義語義約束 制定乙個不被改動的物件,編譯器會強制實施這項約束。只要某值保持不變時事實,就應該確實說出來,這樣編譯器可以確保這項約束不違反。const多才多藝 可以用在classes外部修飾global或namespace作用域中的常量,或修飾檔案 函式 或區塊作用於中被宣告為static...

盡可能使用const

一 中心思想 1 將某些東西宣告為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的物件 函式引數 函式返回型別 函式返回型別 成員函式本體 2 編譯器強制實施bitwise constness,但你編寫程式時應該使用 概念上的常量性 3 當const和non const成員函...