Các mutable
từ khóa là một cách để xuyên qua const
tấm màn che bạn treo lên trên đối tượng của bạn. Nếu bạn có một tham chiếu const hoặc con trỏ tới một đối tượng, bạn không thể sửa đổi đối tượng đó theo bất kỳ cách nào ngoại trừ khi nào và làm thế nào nó được đánh dấu mutable
.
Với const
tham chiếu hoặc con trỏ của bạn, bạn bị ràng buộc để:
- chỉ đọc quyền truy cập cho bất kỳ thành viên dữ liệu hiển thị
- quyền chỉ gọi các phương thức được đánh dấu là
const
.
Các mutable
ngoại lệ làm cho nó vì vậy bây giờ bạn có thể viết hoặc thiết lập các thành viên dữ liệu được đánh dấu mutable
. Đó là sự khác biệt duy nhất có thể nhìn thấy bên ngoài.
Bên trong những const
phương thức mà bạn có thể nhìn thấy cũng có thể ghi vào các thành viên dữ liệu được đánh dấu mutable
. Về cơ bản, bức màn const được xuyên thủng toàn diện. Nó hoàn toàn phụ thuộc vào người thiết kế API để đảm bảo rằng mutable
nó không phá hủy const
khái niệm và chỉ được sử dụng trong các trường hợp đặc biệt hữu ích. Các mutable
từ khóa giúp bởi vì nó rõ ràng đánh dấu dữ liệu thành viên phải tuân theo những trường hợp đặc biệt.
Trong thực tế, bạn có thể sử dụng một cách const
ám ảnh trong toàn bộ cơ sở mã hóa của mình (về cơ bản bạn muốn "lây nhiễm" cơ sở mã hóa của mình với const
"căn bệnh"). Trong thế giới này, các tham chiếu và tham chiếu const
có rất ít ngoại lệ, mang lại mã dễ hiểu và dễ hiểu hơn. Đối với một digression thú vị tìm kiếm "minh bạch tham chiếu".
Nếu không có mutable
từ khóa, cuối cùng bạn sẽ bị buộc phải sử dụng const_cast
để xử lý các trường hợp đặc biệt hữu ích khác nhau mà nó cho phép (bộ nhớ đệm, đếm ref, gỡ lỗi dữ liệu, v.v.). Thật không may const_cast
là có sức tàn phá đáng kể hơn mutable
vì nó buộc máy khách API phá hủy sự const
bảo vệ của (các) đối tượng mà anh ta đang sử dụng. Ngoài ra, nó còn gây ra sự const
phá hủy trên diện rộng : const_cast
ing một con trỏ const hoặc tham chiếu cho phép ghi và gọi phương thức truy cập vào các thành viên hữu hình. Ngược lại, mutable
yêu cầu nhà thiết kế API thực hiện kiểm soát chi tiết tốt đối với các const
ngoại lệ và thông thường các ngoại lệ này được ẩn trong const
các phương thức hoạt động trên dữ liệu riêng tư.
(NB Tôi đã đề cập đến khả năng hiển thị dữ liệu và phương thức một vài lần. Tôi đang nói về các thành viên được đánh dấu là công khai so với riêng tư hoặc được bảo vệ, đây là một loại bảo vệ đối tượng hoàn toàn khác được thảo luận ở đây .)