寒江雪 盡可能使用const

2021-07-24 16:28:50 字數 2459 閱讀 2012

使用const的目的是為了指明乙個不可被改動的物件,編譯器會強制實施這項約束。

const與指標之間糾纏不清的關係

lconst int* p;  //p是乙個指向const int 的指標,指標無法修改指向的值

lint* const p;  //p是乙個指標常量,無法修改其值,俗稱無法修改指向

lconst int* const p; //綜合以上兩種

stl迭代器是以指標作為根據塑模出來的,所以迭代器的作用就像個t*指標。宣告迭代器為const就像宣告指標為const一樣(即宣告乙個t* const指標),表示這個迭代器不得指向不同的東西。如果希望迭代器所指的東西不可被改動,你需要的是const_iterator

令函式返回乙個常量值往往可以降低因客戶錯誤而造成的意外,而又不至於放棄安全性和高效性。

考慮有理數operator*的宣告式

class rational;

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

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

以上兩種宣告式子看似差不多,但前者可以避免如下錯誤

(a*b)=c;

如果使用後者的宣告式,上式是可以編譯通過的。這種錯誤看起來似乎很沒意思,但是一旦出錯,就是可能就調bug到天亮了。因此在此條款中特別指出來,養成良好的習慣。另外,這種錯誤很可能會出現的位置是作為判斷條件出現

if(a*b=c)

出現這種錯誤只是少打了乙個「=」。如果a,b,c都是內建型別,編譯器會告訴你,這裡錯了。而如果是使用者自定義型別可不一定。乙個「良好的使用者自定義型別」的特徵是它們避免無端地與內建型別不相容,也就是在面對編譯器時,能和內建型別一樣保持著同錯同對的性質,這裡舉的例子說的是給存放函式返回值的臨時變數賦值,內建型別被視為錯誤,使用者自定義型別也應該視為錯誤。讓函式返回常量值是一種預防措施

const成員函式

將const實施於成員函式的目的是為了確認該成員函式可作用於const物件身上。

這一類成員函式之所以重要,基於兩個理由

l它們使class介面比較容易被理解。因為知道哪個成員函式會改變物件內容和哪個函式不行是很重要的。

l它們使「操作const物件」成為可能。這對編寫高效**是個關鍵,改善c++程式效率的乙個根本辦法是以pass by reference to const方式傳遞物件,而此技術可行的前提是,我們有const成員來處理取得的const物件

兩個常量性不同的成員函式的過載

考慮下面這個例子:

const char& operator(std::size_tposition)const

return textlength;

如果要堅持在const函式中修改某些值,需要把被修改值宣告為mutable(可變的)

mutable std::size_t textlength;

在const和non-const成員函式中避免重複

考慮如下情況:

假設textblock內的operator不只是返回乙個reference指向某字元,也執行邊界檢查,誌記訪問資訊,甚至可能進行資料完善性檢驗。把所有這些同時放進const和non-const中,導致**重複了很多次,即使將以上操作宣告為private成員函式,也重複呼叫了很多次

const char& operator(std::size_tposition)const{

returntext[position];

char& operator(std::size_t position){

returntext[position];

這兩個成員函式就產生了**重複

改進方案是利用後者呼叫前者

改進後:

char& operator(std::size_t position){

returnconst_cast(//去掉const性質,呼叫op

static_cast(*this)[position];將當前物件轉換為const,呼叫const op;

)但是反向做法是不應該的。記住,const成員函式承諾不會改變物件的邏輯狀態,non-const並沒有這般承諾。如果const成員函式呼叫non-const成員函式,就冒了改變物件的風險。因此是錯誤的行為。

最後小結:const是個奇妙且非比尋常的東西。在指標和迭代器身上,在指標,迭代器及reference涉及的物件身上。在函式引數和返回型別身上。在local變數身上。在成員函式身上。林林總總不一而足,const是個威力強大的助手。盡可能使用它,你會對你的作為感到高興。

【某些**沒有寫全,大小寫變數由於word的自動校對而懶得更改,如果你是我的讀者,首先請原諒我的懶惰,接著我會鼓勵你發揮你的想象力去理解它,大膽地指出我**沒對,我覺得這是很有成就感的事情,也是很有意思的事情。設想一下你在看一本書,但是書裡的**很難理解,且只有一部分,這時候你要去猜作者的意圖和上層呼叫方法,如果能走得通,那一定是一件非常激動人心的事不是嗎o(∩_∩)o】

盡可能使用 const

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

盡可能使用const

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

盡可能使用const

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