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).