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