Kata mutable
kunci adalah cara untuk menembus const
selubung yang Anda gantungkan pada objek Anda. Jika Anda memiliki referensi const atau pointer ke suatu objek, Anda tidak dapat memodifikasi objek itu dengan cara apa pun kecuali kapan dan bagaimana itu ditandai mutable
.
Dengan const
referensi atau penunjuk, Anda dibatasi untuk:
- hanya akses baca untuk setiap anggota data yang terlihat
- izin untuk memanggil hanya metode yang ditandai sebagai
const
.
The mutable
pengecualian membuatnya begitu Anda sekarang dapat menulis atau anggota kumpulan data yang ditandai mutable
. Itulah satu-satunya perbedaan yang terlihat secara eksternal.
Secara internal, const
metode yang terlihat oleh Anda juga dapat menulis ke anggota data yang ditandai mutable
. Pada dasarnya cadar itu ditusuk secara komprehensif. Terserah sepenuhnya kepada perancang API untuk memastikan bahwa mutable
tidak merusak const
konsep dan hanya digunakan dalam kasus khusus yang bermanfaat. Kata mutable
kunci membantu karena dengan jelas menandai anggota data yang tunduk pada kasus khusus ini.
Dalam praktiknya Anda dapat menggunakan secara const
obsesif di seluruh basis kode Anda (Anda pada dasarnya ingin "menginfeksi" basis kode Anda dengan const
"penyakit"). Di dunia ini, petunjuk dan rujukan adalahconst
dengan sangat sedikit pengecualian, menghasilkan kode yang lebih mudah untuk dipikirkan dan dipahami. Untuk penyimpangan yang menarik lihat "transparansi referensial".
Tanpa mutable
kata kunci, Anda pada akhirnya akan dipaksa untuk menggunakan const_cast
berbagai kasus khusus yang berguna yang dibolehkannya (caching, penghitungan referensi, data debug, dll.). Sayangnya const_cast
secara signifikan lebih merusak daripada mutable
karena memaksa klien API untuk menghancurkan const
perlindungan objek yang dia gunakan. Selain itu menyebabkan const
kerusakan luas : const_cast
ing pointer atau referensi const memungkinkan menulis tanpa terkecuali dan metode panggilan akses ke anggota yang terlihat. Sebaliknya mutable
mengharuskan perancang API untuk melakukan kontrol halus atas const
pengecualian, dan biasanya pengecualian ini tersembunyi dalam const
metode yang beroperasi pada data pribadi.
(NB Saya merujuk pada visibilitas data dan metode beberapa kali. Saya berbicara tentang anggota yang ditandai sebagai publik vs privat atau dilindungi yang merupakan jenis perlindungan objek yang sama sekali berbeda yang dibahas di sini .)