Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Từ khóa mutable trong C++

Các thành viên dữ liệu mutable (có thể thay đổi) là những thành viên có giá trị có thể thay đổi lúc chạy (runtime) ngay cả khi đối tượng là kiểu const (hằng). Đây là đối lập với const.

Đôi khi logic yêu cầu chỉ một hoặc hai thành viên dữ liệu là biến, các thành viên khác là hằng để xử lý dữ liệu. Trong tình huống đó, mutable rất hữu ích để quản lý class.

Ví dụ

#include <iostream>
using namespace std;

class Test {
public:
    int a;
    mutable int b;  // Có thể thay đổi даже khi object là const
    
    Test(int x = 0, int y = 0) {
        a = x;
        b = y;
    }
    
    void seta(int x = 0) { a = x; }
    void setb(int y = 0) { b = y; }
    
    void disp() {
        cout << endl << "a: " << a << " b: " << b << endl;
    }
};

int main() {
    const Test t(10, 20);
    cout << t.a << " " << t.b << "\n";
    
    // t.a = 30; // LỖI: không thể thay đổi a vì object là const
    t.b = 100;   // HỢP LỆ: b là mutable, có thể thay đổi
    
    cout << t.a << " " << t.b << "\n";
    return 0;
}

Kết quả

10 20
10 100

Khi nào nên dùng mutable?

  • Cache: lưu kết quả tính toán tốn kém để tránh tính lại (lazy evaluation).
  • Đếm số lần truy cập (reference counting, access counter).
  • Lock/Mutex trong đa luồng (mutex thường được đánh dấu mutable để lock trong const method).
  • Logging/debugging bên trong const method.

Lưu ý quan trọng

Mutable không nên được lạm dụng. Nó phá vỡ ngữ nghĩa const-correctness. Chỉ dùng khi thực sự cần thiết và có lý do chính đáng (như cache, mutex, logging).