mutableAnahtar kelime delmek için bir yoldur constsize nesneleri üzerinde yayılacak peçe. Bir nesneye const referansınız veya işaretçiniz varsa, o nesneyi ne zaman ve nasıl işaretlendiği dışında hiçbir şekilde değiştiremezsiniz mutable.
Senin ile constbaşvuru veya pointer size kısıtlanır:
- yalnızca görünür veri üyeleri için okuma erişimi
- yalnızca olarak işaretlenmiş yöntemleri çağırma izni
const.
mutableŞimdi yazabilir veya işaretlenmiş ayarlanan veri üyeleri böylece istisna yapar mutable. Dışarıdan görünen tek fark bu.
Dahili constolarak size göre görünen yöntemler işaretli veri üyelerine de yazabilir mutable. Esasen, yapı perdesi kapsamlı bir şekilde delinmiştir. Konsepti mutableyok etmediğinden constve yalnızca yararlı özel durumlarda kullanıldığından emin olmak tamamen API tasarımcısına bağlıdır . mutableAnahtar kelime bu özel durumlar tabi bunun nedeni açıkça işaretleri veri üye olur.
Uygulamada constkod tabanınız boyunca obsesif olarak kullanabilirsiniz (esasen kod tabanınızı const"hastalık" ile "enfekte etmek istersiniz ). Bu dünyada işaretçiler ve referanslar constçok az istisna dışında, akıl yürütmesi ve anlaması daha kolay olan kod verir. İlginç bir araştırma için "referans şeffaflığı" konusuna bakın.
mutableAnahtar kelime olmadan, sonunda const_castçeşitli yararlı özel durumları (önbellekleme, ref sayımı, hata ayıklama verileri, vb.) Ne yazık ki API istemcisini kullandığı nesnelerin / nesnelerin korunmasını yok etmeye zorladığı için const_castönemli ölçüde daha yıkıcıdır . Ek olarak yaygın yıkıma neden olur : bir sabit işaretçi veya başvuru oluşturmak, görünür üyelere serbest yazma ve yöntem çağırma erişimi sağlar. Bunun aksine , API tasarımcısının istisnalar üzerinde hassas bir kontrol gerçekleştirmesini gerektirir ve genellikle bu istisnalar özel veriler üzerinde çalışan yöntemlerde gizlenir .mutableconstconstconst_castmutableconstconst
(Not: Birkaç kez veri ve yöntem görünürlüğüne atıfta bulunuyorum . Burada tartışılan tamamen farklı bir nesne koruma türü olan, kamuya açık veya özel veya korumalı olarak işaretlenmiş üyelerden bahsediyorum .)