Ini sebagian besar membahas baris kedua: praktik terbaik, tugas, parameter fungsi dll.
Latihan umum. Cobalah untuk membuat segala const
yang Anda bisa. Atau dengan kata lain, buat semuanya const
untuk memulai, dan kemudian hapus set minimumconst
diperlukan untuk memungkinkan program berfungsi. Ini akan sangat membantu dalam mencapai pembenaran yang benar, dan akan membantu memastikan bahwa bug halus tidak diperkenalkan ketika orang mencoba dan menetapkan hal-hal yang seharusnya tidak mereka modifikasi.
Hindari const_cast <> seperti wabah. Ada satu atau dua kasus penggunaan yang sah untuk itu, tetapi mereka sangat sedikit dan jarang. Jika Anda mencoba mengubah const
objek, Anda akan melakukan jauh lebih baik untuk menemukan siapa pun yang menyatakannyaconst
pada langkah pertama dan membicarakannya dengan mereka untuk mencapai konsensus tentang apa yang harus terjadi.
Yang mengarah ke tugas dengan sangat rapi. Anda dapat menetapkan ke dalam sesuatu hanya jika itu non-const. Jika Anda ingin menetapkan sesuatu yang const, lihat di atas. Ingatlah bahwa dalam deklarasi int const *foo;
dan int * const bar;
hal-hal yang berbedaconst
- jawaban lain di sini telah membahas masalah itu dengan mengagumkan, jadi saya tidak akan membahasnya.
Parameter fungsi:
Lewati nilai: mis. void func(int param)
Anda tidak peduli dengan satu atau lain cara di situs panggilan. Argumen dapat dibuat bahwa ada kasus penggunaan untuk mendeklarasikan fungsi sebagai void func(int const param)
tetapi yang tidak berpengaruh pada pemanggil, hanya pada fungsi itu sendiri, dalam nilai apa pun yang dilewatkan tidak dapat diubah oleh fungsi selama panggilan.
Lulus dengan referensi: mis. void func(int ¶m)
Sekarang itu membuat perbedaan. Seperti yang baru saja dinyatakan func
diizinkan untuk berubah param
, dan situs panggilan apa pun harus siap untuk menghadapi konsekuensinya. Mengubah deklarasi untuk void func(int const ¶m)
mengubah kontrak, dan jaminan yang func
sekarang tidak dapat berubahparam
, berarti apa yang disahkan adalah apa yang akan keluar. Seperti yang telah dicatat orang lain, ini sangat berguna untuk melewati benda besar yang tidak ingin Anda ubah dengan murah. Melewati referensi jauh lebih murah daripada melewatkan objek besar berdasarkan nilai.
Lewati dengan penunjuk: misalnya void func(int *param)
dan void func(int const *param)
Keduanya cukup identik dengan rekan referensi mereka, dengan peringatan bahwa fungsi yang dipanggil sekarang perlu diperiksa nullptr
kecuali beberapa jaminan kontrak lainnya memastikan func
bahwa ia tidak akan pernah menerima nullptr
in param
.
Sepotong opini tentang topik itu. Membuktikan kebenaran dalam kasus seperti ini sangat sulit, terlalu mudah untuk membuat kesalahan. Jadi jangan mengambil risiko, dan selalu periksa parameter pointer untuk nullptr
. Anda akan menyelamatkan diri dari rasa sakit dan penderitaan dan sulit menemukan serangga dalam jangka panjang. Dan untuk biaya pemeriksaan, ini sangat murah, dan dalam kasus-kasus di mana analisis statis yang dibangun dalam kompiler dapat mengelolanya, pengoptimal akan tetap melakukannya. Aktifkan Tautan Pembuatan Kode Waktu untuk MSVC, atau WOPR (saya pikir) untuk GCC, dan Anda akan membuatnya lebar program, yaitu bahkan dalam pemanggilan fungsi yang melintasi batas modul kode sumber.
Pada akhir hari semua hal di atas membuat kasus yang sangat solid untuk selalu lebih suka referensi ke petunjuk. Mereka semua lebih aman.