Kata mutablekunci adalah cara untuk menembus constselubung 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 constreferensi atau penunjuk, Anda dibatasi untuk:
- hanya akses baca untuk setiap anggota data yang terlihat
- izin untuk memanggil hanya metode yang ditandai sebagai
const.
The mutablepengecualian membuatnya begitu Anda sekarang dapat menulis atau anggota kumpulan data yang ditandai mutable. Itulah satu-satunya perbedaan yang terlihat secara eksternal.
Secara internal, constmetode 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 mutabletidak merusak constkonsep dan hanya digunakan dalam kasus khusus yang bermanfaat. Kata mutablekunci membantu karena dengan jelas menandai anggota data yang tunduk pada kasus khusus ini.
Dalam praktiknya Anda dapat menggunakan secara constobsesif 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 mutablekata kunci, Anda pada akhirnya akan dipaksa untuk menggunakan const_castberbagai kasus khusus yang berguna yang dibolehkannya (caching, penghitungan referensi, data debug, dll.). Sayangnya const_castsecara signifikan lebih merusak daripada mutablekarena memaksa klien API untuk menghancurkan constperlindungan objek yang dia gunakan. Selain itu menyebabkan constkerusakan luas : const_casting pointer atau referensi const memungkinkan menulis tanpa terkecuali dan metode panggilan akses ke anggota yang terlihat. Sebaliknya mutablemengharuskan perancang API untuk melakukan kontrol halus atas constpengecualian, dan biasanya pengecualian ini tersembunyi dalam constmetode 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 .)