可變數據成員
有時(但不會特別頻繁)會發生這樣一種情況,我們希望能修改類的某個數據成員,即使是在一個const成員函數內,可以通過在變量的聲明中加入mutable關鍵字做到這一點。
一個const成員函數可以改變一個可變成員的值。舉個例子,我們將給Screen添加一個名爲access_ctr的可變成員,通過它我們可以追蹤每個Screen的成員函數被調用了多少次。
class Screen{
public:
void some_member() const;
private:
mutable size_t access_ctr;//即使在一個const對象內也可以修改
};
void Screen::some_member() const{
++access_ctr;//保存一個計數值,用於記錄成員函數被調用的記錄
}
返回this的成員函數
inline Screen &Screen::set(char c)
{
contents[cursor] = c; // 設置給定位置的新值
return *this; // 將this作爲左值對象返回
}
inline // 可是顯示定義inline,也可以隱式
Screen &Screen::move(pos r, pos c)
{
pos row = r * width; // compute the row location
cursor = row + c; // move cursor to the column within that row
return *this; // 將this作爲左值返回
}
返回引用的函數是左值的,意味着這些函數返回的是對象本身而不是對象的副本,如果我們把一系列這樣的對象連接在一起:
myScreen.move(4,0).set('#');
上面這個語句等價於
myScreen.move(4,0);
myScreen.set('#');
如果我們另move和set返回Screen而不是Screen& ,則上面的行爲則大不相同:
Screen temp = myScreen.move(4,0);//會對返回值進行拷貝
temp.set('#');//不會改變myScreen的content
從const成員函數返回*this
我們可以添加一個名爲display的操作,負責打印Screen內容,因爲負責打印並不需要改變Screen的內容,因此我們另display爲一個const成員。
const Screen &display(std::ostream &os) const
{ do_display(os); return *this; }
此時display返回的是const引用,則我們不能將display嵌入到一組動作序列中去。
//如果display返回常量引用,則調用set就會引發錯誤。
myScreen.display(count).set('#');
即使myScreen是個非常量對象,對set的調用也無法通過編譯;
一個const成員函數如果以引用的形式返回*this,那麼它返回的類型將是常量引用。