Bu çoğunlukla ikinci satırı ele alır: en iyi uygulamalar, ödevler, fonksiyon parametreleri vb.
Genel Pratik. const
Yapabileceğiniz her şeyi yapmaya çalışın . Ya da başka bir deyişle, herşeyi const
başlatabilir ve daha sonra const
programın çalışmasına izin vermek için gereken minimum s kümesini tam olarak kaldırabilirsiniz . Bu, doğruluk doğruluğuna ulaşmada büyük bir yardımcı olacak ve insanlar değiştirmeleri gerekmeyen şeylere girmeye çalıştıklarında ince hataların ortaya çıkmamasına yardımcı olacaktır.
Veba gibi const_cast <> kullanmaktan kaçının. Bunun için bir veya iki meşru kullanım durumu var, ancak bunlar çok az ve çok uzak. Bir const
nesneyi değiştirmeye çalışıyorsanız , onu const
ilk hızda kimin bildirdiğini bulmak ve ne olması gerektiği konusunda bir fikir birliğine varmak için konuyu onlarla konuşmak için çok daha iyi yapacaksınız .
Bu da çok düzgün bir şekilde ödevlere yol açar. Bir şeye ancak sabit değilse atayabilirsiniz. Sabit bir şeye atamak istiyorsanız, yukarıya bakın. Bildirimlerde int const *foo;
ve int * const bar;
farklı şeyler olduğunu unutmayın const
- buradaki diğer cevaplar bu sorunu takdirle karşıladı, bu yüzden içine girmeyeceğim.
Fonksiyon parametreleri:
Değere göre geçin: ör void func(int param)
. Arayan sitede şu veya bu şekilde umursamazsınız. Fonksiyonu şöyle bildirmek için kullanım örnekleri olduğu, void func(int const param)
ancak arayan üzerinde, sadece fonksiyonun kendisi üzerinde hiçbir etkisi olmayan argümanların çağrı sırasında fonksiyon tarafından değiştirilemeyeceği argümanı yapılabilir .
Referans ile geç: Örneğin void func(int ¶m)
, şimdi bir fark yaratıyor. Sadece beyan edildiği gibi func
değişmesine izin verilir param
ve herhangi bir çağrı sitesi sonuçları ile başa çıkmak için hazır olmalıdır. Beyannamenin değiştirilmesi void func(int const ¶m)
sözleşmeyi değiştirir ve func
şimdi değiştirilemeyen garantiler param
, yani neyin geçeceği anlamına gelir. Diğerlerinin de belirttiği gibi, bu, değiştirmek istemediğiniz büyük bir nesneyi ucuza geçirmek için çok yararlıdır. Bir referans iletmek, büyük bir nesneyi değere göre geçirmekten daha ucuzdur.
İşaretçi ile geçin : örneğin void func(int *param)
ve void func(int const *param)
Bu ikisi, referans sözleşmeleriyle hemen hemen eşanlamlıdır, çağrılan işlevin artık nullptr
başka bir sözleşme garantisi func
asla içeri girmeyeceğini garanti etmediği sürece kontrol etmesi gereken uyarıyla nullptr
birlikte param
.
Bu konudaki fikir parçası. Böyle bir durumda doğruluğu kanıtlamak çok zor, bir hata yapmak çok kolay. Bu yüzden şansınızı denemeyin ve her zaman işaretçi parametrelerini kontrol edin nullptr
. Kendinizi acı ve ıstıraptan kurtaracak ve uzun vadede böcek bulmak zor olacaksınız. Ve çek maliyetine gelince, kir ucuzdur ve derleyiciye yerleştirilen statik analizin onu yönetebileceği durumlarda, optimizer yine de onu seçecektir. MSVC için Link Time Code Generation'ı veya GCC için WOPR'yi (sanırım) açın ve program genişliğinde, yani bir kaynak kodu modülü sınırını aşan işlev çağrılarında bile.
Günün sonunda, yukarıdakilerin tümü, her zaman işaretçi referanslarını tercih etmek için çok sağlam bir durum ortaya koyar. Her yönden daha güvenli.