Các mutabletừ khóa là một cách để xuyên qua consttấ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 consttham 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 mutablengoạ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 constphươ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 mutablenó không phá hủy constkhái niệm và chỉ được sử dụng trong các trường hợp đặc biệt hữu ích. Các mutabletừ 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 constcó 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ó mutabletừ 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_castlà có sức tàn phá đáng kể hơn mutablevì nó buộc máy khách API phá hủy sự constbả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ự constphá hủy trên diện rộng : const_casting 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, mutableyê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 constngoại lệ và thông thường các ngoại lệ này được ẩn trong constcá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 .)