Jadi mengapa tepatnya selalu disarankan untuk menggunakan const sesering mungkin? Sepertinya saya bahwa menggunakan const bisa lebih menyakitkan daripada bantuan dalam C ++. Tapi sekali lagi, saya datang pada ini dari perspektif python: jika Anda tidak ingin sesuatu diubah, jangan mengubahnya. Maka dengan itu, ada beberapa pertanyaan:
Sepertinya setiap kali saya menandai sesuatu sebagai const, saya mendapatkan kesalahan dan harus mengubah beberapa fungsi lain menjadi const juga. Maka ini menyebabkan saya harus mengubah lain fungsi di tempat lain. Apakah ini sesuatu yang semakin mudah dengan pengalaman?
Apakah manfaat menggunakan const benar-benar cukup untuk mengimbangi masalah? Jika Anda tidak berniat mengubah objek, mengapa tidak hanya menulis kode yang tidak mengubahnya?
Saya harus mencatat bahwa pada titik waktu ini, saya paling fokus pada manfaat menggunakan const untuk tujuan perbaikan dan pemeliharaan, meskipun itu juga baik untuk memiliki gagasan tentang implikasi kinerja.
sumber
const
Jawaban:
Ini adalah artikel definitif tentang "const correctness": https://isocpp.org/wiki/faq/const-correctness .
Singkatnya, menggunakan const adalah praktik yang baik karena ...
Kompilator dapat mengoptimalkannya. Misalnya, Anda dilindungi dari
Pada saat yang sama, kompiler dapat menghasilkan kode yang lebih efisien karena ia tahu persis bagaimana keadaan variabel / fungsi setiap saat. Jika Anda menulis kode C ++ yang ketat, ini bagus.
Anda benar karena sulit untuk menggunakan const-correctness secara konsisten, tetapi kode akhir lebih ringkas dan lebih aman untuk diprogram. Ketika Anda melakukan banyak pengembangan C ++, manfaat ini cepat terwujud.
sumber
const
variabel dapat meningkatkan kecepatan dalam arti bahwa kompiler dapat menghasilkan kode yang lebih optimal karena ia tahu maksud penuh dan penggunaan variabel. Apakah Anda akan melihat perbedaannya? Nah, itu masih bisa diperdebatkan pada aplikasi Anda. Sejauh menyangkut concurrency, const-variable adalah read-only yang berarti tidak ada kebutuhan untuk kunci eksklusif pada variabel-variabel tersebut karena nilainya akan selalu sama.const
berarti thread-safe dan memperlakukan kode Anda sendiri dengan cara ini membuatnya lebih mudah untuk memeriksa kemungkinan masalah multi-threading dan merupakan cara mudah untuk memberikan jaminan API untuk pengguna API Anda.Berikut adalah sepotong kode dengan kesalahan umum yang benar dapat melindungi Anda dari:
sumber
Dari pengalaman, ini adalah mitos total. Itu terjadi ketika non-benar-benar duduk dengan kode benar-benar, benar. Jika Anda merancang const-correct dari awal, ini TIDAK PERNAH akan menjadi masalah. Jika Anda membuat sesuatu const, dan sesuatu yang lain tidak bermasalah, kompiler memberi tahu Anda sesuatu yang sangat penting, dan Anda harus meluangkan waktu untuk memperbaikinya dengan benar .
sumber
const
dengan benar (yaitu "dari awal") maka memang tidak akan ada masalah, yang merupakan intinya!Ini bukan untuk Anda ketika Anda menulis kode pada awalnya. Ini untuk orang lain (atau Anda beberapa bulan kemudian) yang sedang melihat deklarasi metode di dalam kelas atau antarmuka untuk melihat apa yang dilakukannya. Tidak memodifikasi objek adalah informasi penting yang dapat diperoleh dari itu.
sumber
Jika Anda menggunakan const secara ketat, Anda akan terkejut betapa sedikit variabel nyata yang ada di sebagian besar fungsi. Seringkali tidak lebih dari penghitung lingkaran. Jika kode Anda mencapai titik itu, Anda mendapatkan perasaan hangat di dalam ... validasi dengan kompilasi ... ranah pemrograman fungsional terdekat ... Anda hampir dapat menyentuhnya sekarang ...
sumber
const adalah janji yang Anda buat sebagai pengembang, dan meminta bantuan kompiler dalam menegakkan.
Alasan saya untuk menjadi benar-benar:
sumber
Filosofi saya adalah bahwa jika Anda akan menggunakan bahasa rewel pada waktu kompilasi cek daripada memanfaatkan sebaik mungkin Anda bisa.
const
adalah cara kompiler untuk mengkomunikasikan apa yang Anda maksud ... lebih baik daripada komentar atau doxygen. Anda membayar harganya, mengapa tidak mendapatkan nilainya?sumber
Pemrograman C ++ tanpa const sama seperti mengemudi tanpa sabuk pengaman.
Sungguh menyakitkan memasang sabuk pengaman setiap kali Anda masuk ke mobil, dan 364 dari 365 hari Anda akan tiba dengan selamat.
Satu-satunya perbedaan adalah bahwa ketika Anda mendapat masalah dengan mobil Anda, Anda akan segera merasakannya, sedangkan dengan pemrograman tanpa const Anda mungkin harus mencari dua minggu apa yang menyebabkan kecelakaan itu hanya untuk mengetahui bahwa Anda secara tidak sengaja mengacaukan argumen fungsi yang Anda melewati referensi non-const untuk efisiensi.
sumber
Untuk pemrograman tertanam, menggunakan secara
const
bijaksana ketika mendeklarasikan struktur data global dapat menghemat banyak RAM dengan menyebabkan data konstan berada di ROM atau flash tanpa menyalin ke RAM pada saat boot.Dalam pemrograman sehari-hari, menggunakan
const
dengan hati - hati membantu Anda menghindari menulis program yang macet atau berperilaku tak terduga karena mereka mencoba untuk memodifikasi string string dan data global konstan lainnya.Ketika bekerja dengan programmer lain pada proyek besar, menggunakan
const
dengan benar membantu mencegah programmer lain mencekik Anda.sumber
const
membantu Anda mengisolasi kode yang "mengubah sesuatu" di belakang Anda. Jadi, di kelas, Anda akan menandai semua metode yang tidak mengubah status objek sebagaiconst
. Ini berarti bahwaconst
instance dari kelas itu tidak akan lagi dapat memanggilconst
metode apa pun . Dengan cara ini, Anda terhindar dari fungsi panggilan yang tidak sengaja yang dapat mengubah objek Anda.Juga,
const
merupakan bagian dari mekanisme kelebihan beban, sehingga Anda dapat memiliki dua metode dengan tanda tangan yang identik, tetapi satu denganconst
dan satu tanpa. Yang satuconst
dipanggil untukconst
referensi, dan yang satu dipanggil untuk yang bukanconst
referensi.Contoh:
sumber
kebenaran konst adalah salah satu hal yang benar-benar harus ada sejak awal. Seperti yang telah Anda temukan, sangat sulit untuk menambahkannya nanti, terutama ketika ada banyak ketergantungan antara fungsi baru yang Anda tambahkan dan fungsi lama yang tidak benar yang sudah ada.
Dalam banyak kode yang saya tulis, itu benar-benar sepadan dengan usaha karena kita cenderung menggunakan banyak komposisi:
Jika kami tidak memiliki const-correctness, maka Anda harus menggunakan mengembalikan objek kompleks dengan nilai untuk meyakinkan diri sendiri bahwa tidak ada yang memanipulasi keadaan internal kelas B di belakang Anda.
Singkatnya, const-correctness adalah mekanisme pemrograman defensif untuk menyelamatkan diri dari rasa sakit di jalan.
sumber
Katakanlah Anda memiliki variabel dalam Python. Anda tahu Anda tidak harus memodifikasinya. Bagaimana jika Anda tidak sengaja melakukannya?
C ++ memberi Anda cara untuk melindungi diri dari melakukan sesuatu yang tidak seharusnya Anda lakukan sejak awal. Secara teknis Anda bisa menyiasatinya, tetapi Anda harus bekerja ekstra untuk menembak diri sendiri.
sumber
Ada artikel yang bagus di sini tentang const di c ++. Pendapatnya cukup lurus ke depan tapi semoga membantu.
sumber
Saat Anda menggunakan kata kunci "const", Anda menentukan antarmuka lain untuk kelas Anda. Ada antarmuka yang mencakup semua metode, dan antarmuka yang hanya mencakup metode const. Jelas ini memungkinkan Anda membatasi akses ke beberapa hal yang tidak ingin Anda ubah.
Ya, memang semakin mudah seiring waktu.
sumber
Saya suka benar const ... dalam teori. Setiap kali saya mencoba untuk menerapkannya dengan ketat dalam prakteknya akhirnya telah rusak dan const_cast mulai merayap dalam membuat kode jelek.
Mungkin itu hanya pola desain yang saya gunakan, tetapi const selalu berakhir menjadi sikat yang terlalu luas.
Misalnya, bayangkan mesin database sederhana ... ia memiliki objek skema, tabel, bidang dll. Seorang pengguna mungkin memiliki pointer 'const Table' yang berarti bahwa mereka tidak diizinkan untuk memodifikasi skema tabel itu sendiri ... tetapi bagaimana dengan memanipulasi data yang terkait dengan tabel? Jika metode Insert () ditandai const, maka secara internal harus membuang konstanta untuk benar-benar memanipulasi database. Jika tidak ditandai const maka itu tidak melindungi terhadap memanggil metode AddField.
Mungkin jawabannya adalah untuk membagi kelas berdasarkan persyaratan konstan, tetapi itu cenderung mempersulit desain lebih daripada yang saya inginkan untuk manfaat yang dibawanya.
sumber
Anda dapat memberikan petunjuk compiler dengan const juga .... sesuai kode berikut
sumber