盡可能使用const

2021-08-19 07:32:25 字數 3157 閱讀 3926

一、中心思想

1、將某些東西宣告為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的物件、函式引數、函式返回型別、函式返回型別、成員函式本體;

2、編譯器強制實施bitwise constness,但你編寫程式時應該使用「概念上的常量性」;

3、當const和non-const成員函式有著實質等價的實現時,令non-const版本呼叫const版本可避免**重複。

二、簡述

1、面對指標,可分為一下兩種情況:

(1)出現在星號左邊,=》被指內容是常量;

一下兩種形式是等價的:

void f1(const widget* pw);

void f1(widget const* pw); 

(2)出現在星號右邊,=》指標自身是常量。兩邊都出現的話,被指內容和指標自身都是常量。

2、面對迭代器(const_iterator)

std::vectorvec;

(1)表示迭代器不得指向不同的東西,但它所指的內容是可以改變的

const std::vector::iterator iter = vec.begin();

*iter = 10;

++iter;   //error, iter是const

(2)表示所指的的內容是不可改動的

std::vector::

const_iterator

citer =  vec.begin();

*citer = 10    //error,*citer是const

++citer;

3、面對返回值

主要作用:

降低使用者錯誤而造成的意外。例如:把「==」鍵入成「=」。

e.gclass rational

const rational operator* (const rational& lhs, const rational& rhs)

int main()

rational a, b, c;

//若無const此語句是合法的,但是內建型別則一定是不合法的。。但是依據c++潛在規定,為了避免無端地與內建型別 的「*」不相容,在函式前面加上const

(a*b) = c;        

//同時也能預防將「==」鍵入成「=」

if(a*b=c)  ......

4、const成員函式

(1)兩個成員函式若只是常量性不同,則可以被過載

const成員函式的重要性:

1)使得class的介面比較容易理解,知道哪個函式可以改動物件的內容,哪個不可以

2)使得「操作const物件」成為可能

e.g

#includeusing namespace std;

class textblock

const char& operator(std::size_t position) const //針對const物件

char& operator(std::size_t position) //針對非const物件

private:

std::string text;

};int main()

note:

兩個成員函式都返回的都是引用,其中非const版本的是char& , 這樣返回的是tb.text[0]d的引用,這樣的話可以對其的值進行改變;

若返回值的型別是char,則不能對其進行重新賦值。

(2)bitwise constness和logical constness

前者認為,成員函式只有在不更改物件的任何成員變數時,也就是不更改物件內的任何乙個bit,這樣才可以說是const;

note:

1)許多成員函式雖然不是組具備const性質卻能通過bitwise測試;

class ctextblock

//const char& operator(std::size_t position) const //針對const物件

// char& operator(std::size_t position) //針對非const物件

char& operator(std::size_t position) const

~ctextblock()

private:

char* ptext;//此類只包含了指標成員,不同於上述的std::string 成員

};

int main()

上述class只有指標成員ptext,不同於之前的類textblock,使用者並未改變該成員,但是卻能改變所指內容的值

,但是仍然能逃過bitwise constness的測試,屬於logical constness。

2)mutable:釋放non-static成員變數的bitwise constness(因為編譯器執意要bitwise constness,所以先釋放bc)

class ctextblock

;std:: size_t ctextblock::length() const

return textlenth;

}

(3)在const和non-const成員函式中避免**的重複

由於過載的const和non-const版本的成員函式有許多重複的**,所以盡量用一次編寫的**使用兩次

1) 可以用const的版本實現non-const的版本,反之則不可以

class textblock

char& operator(std::size_t position)

//運用const operator實現出non-const版本,反之則不行

private:

std::string text;

};

note:

此類有連個轉型動作:

1、static_cast: 將普通物件加上const屬性,使之可以呼叫const版本的成員函式;

2、const_cast: 去除返回值的const屬性

盡可能使用 const

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

盡可能使用const

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

盡可能使用const

編譯器可以對其進行靜態資料型別檢查 若你在編寫函式時,並沒有打算改變引數,這是就應該將引數的型別設定為const reference,這樣既可以保證引數的常量性,又提高了傳值的效率 若函式的返回值時const pointer,則返回值不可被直接修改,而且返回值必須賦值給const同種型別 令函式返回...