2009年4月5日 星期日

C/C++的Const(下)

const在類別的使用也是非常....有趣


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的小結

沒有留言: