一、中心思想
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同種型別 令函式返回...