Về mutable const

Rẽ từ comment này

Mình có search SO thì thấy có hình như mutable const chỉ có thằng C++ mới có.

Mình không chuyên về C++ nên cũng không biết tại sao lại có vụ này. Các bác nào làm C++ giải thích cho mình với nhé.

https://en.cppreference.com/w/cpp/language/cv
mutable này phải xét trong ngữ cảnh một thuộc tính của class :slight_smile: tức là nó vẫn có thể thay đổi dù object nó đang const.

3 Likes

https://youtu.be/XkDEzfpdcSg?t=878 đây nè
14:38 mutable là để tránh cast bỏ const

ví dụ viết 1 cái Renderer đơn giản, trong đó có hàm void Renderer::draw() const. Nhưng mỗi lần draw() khá lâu nên nếu screen ko có thay đổi gì thì đừng draw lại. Ta có thể thêm biến bool needToRedraw = true vào Renderer:

class Renderer {
public:
    void draw() const {
        if (needToRedraw) {
            redraw();
            needToRedraw = false; // cần reset needToRedraw lại
        }
    }
private:
    void redraw() const { ... }
private:
    bool needToRedraw = true;
};

nhưng lúc này hàm draw() là hàm nhận const Renderer* this, ko thay đổi giá trị của needToRedraw được :V :V chả lẽ ta cần thay đổi draw thành void draw() (ko có const) chỉ để thay đổi giá trị biến needToRedraw này? Đương nhiên là ko vì hàm draw() ko thay đổi giá trị của Renderer. Như vậy chúng ta cần const_cast biến needToRedraw ở đây :V :V Nhưng nó rất xấu xí. C++ cho phép thêm mutable vào thế cho cái const_cast kia:

private:
    mutable bool needToRedraw = true;

như vậy void draw() const vẫn thay đổi giá trị needToRedraw được mặc dù thisconst Renderer*

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?