class T{
private:
int data;
public:
void op()const{}
};
java跟C#碰多了,再回來看c++的一些用法真的會覺得很詭異
在此op稱作const member function(常態成員函數)
在跟compiler說函式op不會修改到成員變數(data)
所以如果在op裡面作出修改成員變數動作將會編譯不過
void op()const{data=0;}
同樣的,如果試圖呼叫函式或是回傳 讓compiler覺得你可能修改到成員變數,也會編譯不過
void op()const{dp(data);gp();}\\X
void dp(int data){}
void gp(){}
compiler會怕妳那個函數可能修改到成員變數
修改方式
void op()const{dp(data);}
void dp(const int& data)const{} \\告訴compiler你不會修改到data
void gp()const{}
或者是
int* op()const{return &data;}
也是沒辦法的,因為傳同一個記憶體變數會讓compiler覺得你會修改到他
必須修改成回傳常數的方式
const int* op()const{return &data;}
而當你變數宣告成常數時,如果使用不為const member function也會compiler失敗
class T{
....
void dp();
}
void get(T& t){}
main(){
const T tester;
tester.dp();\\ X
get(tester);\\X
}
必須修改成
class T{
....
void dp()const; \\我不會更改成員
}
void get(const T& t){}\\我不會更改成員
main(){
const T tester;
tester.dp();
get(tester);
}
簡單來說,就是const函數,只能存取同為const的行為
成員函數調用成員函數
呼叫 在呼叫 O/X
const const O
const non-const X
non-const const O
non-const non-const O
或者是將成員宣告成
mutable int data;
mutable是c++的關鍵字,基本上是不建議這樣做,只會讓debug更複雜
或是將迴船方法改成
return const_cast(data)
將const屬性去除
a. const對象只能訪問const成員函數,而非const對象可以訪問任意的成員函數,包括const成員函數.
b. const對象的成員是不可修改的,然而const對象通過指針維護的對象卻是可以修改的.
c. const成員函數不可以修改對象的數據,不管對象是否具有const性質.它在編譯時,以是否修改成員數據為依據,進行檢查.
e. 然而加上mutable修飾符的數據成員,對於任何情況下通過任何手段都可修改,自然此時的const成員函數是可以修改它的
引用自http://hi.baidu.com/maolang0/blog/item/e0546a8bd03a4c14c8fc7a12.html
最後來提個有趣的例子 關於運算子多載跟const
class T { // "unlimited precision int"
public:
T& operator++(); // prefix
const T operator++(int); // postfix
};
為什麼在此要用const呢
是為了user做蠢事像是
T a,b,c;
(a+b)=c;
\\or 防止
(a+b)+c;
以上 最近複習C++ const的小結
沒有留言:
張貼留言