C 7 const的一些使用

2021-10-09 18:51:31 字數 2181 閱讀 2676

const的用法,特別是用在函式前面與後面的區別!

沒有學不會的 c++:logic constness 和 bitwise constness

advanced c++ – logic constness and bitwise constness

int

func

(void

)const

補充:const放在後面跟前面有區別麼,準確的說const是修飾**this指向的物件**。

classa

;//這裡f函式其實有兩個引數,第乙個是a*const this, 另乙個才是int型別的引數

如果我們不想f函式改變引數的值,可以把函式原型改為f(const int),但如果我們不允許f改變this指向的物件呢?因為this是隱含引數,const沒法直接修飾它,就加在函式的後面了,表示this的型別是const a* const this

const修飾*this是本質,至於說「表示該成員函式不會修改類的資料。否則會編譯報錯」之類的說法只是乙個現象,根源就是因為*thisconst型別的

1 要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;

2 要避免最一般的賦值操作錯誤,如將const變數賦值,具體可見思考題;

3 在引數中使用const應該使用引用或指標,而不是一般的物件例項,原因同上;

4 const在成員函式中的三種用法要很好的使用;

5 不要輕易的將函式的返回值型別定為const;

6 除了過載操作符外一般不要將返回值型別定為對某個物件的const引用;

首先介紹一下什麼是logic constness和bitwise constness,

有以下類bigarray,其成員vectorv;是乙個陣列資料結構,為了讓外部可以訪問該陣列,此類提供了乙個getitem介面,除此之外,為了計算外部訪問陣列的次數,該類還設定了乙個計數器accesscounter,可以看到使用者每次呼叫getitem介面,accesscounter就會自增,很明顯,這裡的成員v是核心成員,而accesscounter是非核心成員,我們希望介面getitem不會修改核心成員,而不考慮非核心成員是否被修改,此時getitem所具備的const特性就被稱為logic constness

class bigarray 

};

但是,上面的**不會通過編譯(const 成員函式,卻修改了類的資料),因為編譯器不會考慮logic constness,於是就有了bitwise constness這個術語,可以理解為字面上的 constness 屬性,編譯器只認 bitwise constness。為了解決這種矛盾,可以把accesscounter宣告為mutable的成員,即

class bigarray 

;

此時既保持了 logic constness 特性,編譯器又可以通過編譯

反過來,如果你的成員是指標型別,在函式中我們修改了指標所指的資料,此時字面上指標變數並沒有被修改,編譯器依然只會維護 bitwise constness,即便我們將這樣的函式宣告為 const,依然是沒有問題的,例如下面的**可以通過編譯

class bigarray 

};

但邏輯上,這個函式不應該被宣告為 const,所以這裡最好把 const 關鍵字去掉。

結論

logic constness 和 bitwise constness 的重要性排序:logic constness > bitwise constness

const 的一些理解

以前覺得自己對const還是有些理解的,今天一兄弟問了乙個問題才讓我對這個東西又加深了些了解 class temp public void output void func const temp a a.output 就這麼簡單乙個東西,眨眼一看,沒什麼問題,但是編譯是不會通過的,因為func呼叫了...

const 的一些知識

收集了別人關於 const 的一些論述。const 的用法很多很靈活,稍不注意,就會有些莫名其妙的問題出現。甲 用於定義乙個不能被更改的變數的時候 const int i 10 i 的值不能被改變,否則報錯 void fun const int i 在函式中,i 的值不能被改變,即使他是個區域性變數...

const的一些用法

關於 c 中的 const 關鍵字的用法非常靈活,而使用 const 將大大改善程式的健壯性,現將本人的一些體會總結如下,期望對大家有所幫助 一const 基礎如果 const 關鍵字不涉及到指標,我們很好理解,下面是涉及到指標的情況 int b 500 const int a b 1 int co...