c++ 之類成員

可變數據成員

有時(但不會特別頻繁)會發生這樣一種情況,我們希望能修改類的某個數據成員,即使是在一個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,那麼它返回的類型將是常量引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章