c/c++筆試題——const型別的成員函式內部如何改變成員變數
在C++中,由const修飾的成員函式的函式體內部,是不能夠對成員變數進行修改的。這個特性被用來保證某些成員函式在實現過程中,避免由於程式設計師大意而對資料進行了錯誤的修改;同時也說明此成員函式是非修改性的。如只需要返回成員變數的成員函式就被宣告為const型別(const的位置在函式定義引數列表之後)
推廣開來,在const成員函式中也不能夠呼叫非const的成員函式。這是因為非const成員函式可能會改變成員變數的值,這與const成員函式的定義相違背。
但是在某些情況下,需要在const函式中改變成員變數。這就需要把成員變數設定成mutable型別。如
class C
{
public:
void func(const int& p) const
{
i = p;
}
private:
mutable int i;
};
如果變數i不宣告為mutable型別,則編譯不會通過。
如果成員變數是一個類型別或者結構型別,而在const函式中呼叫這些變數的成員函式,除了用mutable宣告外,還可以用一種變通的方法:
class D
{
public:
void op(){}
}
class C
{
public:
void func(const int& p, D& d) const
{
i = p;
d.op();
}
private:
mutable int i;
D cd;
};
然後在呼叫時,引數D& d以*this作為輸入,也可以達到呼叫非const函式的作用。
P.S 最近閱讀相關的文章,又學到了一種方法,能夠使得在const成員函式中呼叫非const成員函式。就是使用const_cast<>運算子。它能夠使得const去掉const的屬性,使得violate屬性去掉violate屬性。上面的例子就可以寫成。
void func() const
{
const_cast<D*>(&cd)->op();
}
同樣能夠編譯通過。