Sebagai seorang programmer C ++ pemula ada beberapa konstruksi yang terlihat masih sangat tidak jelas bagi saya, salah satunya adalah const
. Anda dapat menggunakannya di banyak tempat dan dengan begitu banyak efek berbeda yang hampir tidak mungkin bagi seorang pemula untuk keluar hidup-hidup. Akankah beberapa guru C ++ menjelaskan sekali selamanya berbagai kegunaan dan apakah dan / atau mengapa tidak menggunakannya?
129
Jawaban:
Mencoba mengumpulkan beberapa kegunaan:
Mengikat beberapa sementara ke referensi-ke-const, untuk memperpanjang masa pakainya. Referensi dapat berupa basis - dan destruktor tidak perlu virtual - destruktor yang tepat masih disebut:
Penjelasan , menggunakan kode:
Trik ini digunakan dalam kelas utilitas ScopeGuard milik Alexandrescu. Setelah sementara keluar dari ruang lingkup, destructor Derived dipanggil dengan benar. Kode di atas melewatkan beberapa detail kecil, tapi itulah masalahnya.
Gunakan const untuk memberi tahu orang lain bahwa metode tidak akan mengubah keadaan logis objek ini.
Gunakan const untuk kelas copy-on-write , untuk membuat kompiler membantu Anda memutuskan kapan dan kapan Anda perlu menyalin.
Penjelasan : Anda mungkin ingin berbagi data saat Anda menyalin sesuatu selama data dari objek asli dan copie akan tetap sama. Setelah salah satu objek mengubah data, Anda perlu dua versi sekarang: Satu untuk yang asli, dan satu untuk salinan. Artinya, Anda menyalin pada tulisan ke objek mana pun, sehingga mereka sekarang memiliki versi sendiri.
Menggunakan kode :
Cuplikan di atas mencetak alamat yang sama pada GCC saya, karena pustaka C ++ yang digunakan mengimplementasikan copy-on-write
std::string
. Kedua string, meskipun mereka adalah objek yang berbeda, berbagi memori yang sama untuk data string mereka. Membuatb
non-const akan lebih memilih versi non-const darioperator[]
dan GCC akan membuat salinan buffer memori backing, karena kita bisa mengubahnya dan itu tidak akan mempengaruhi dataa
!Untuk copy-constructor untuk membuat salinan dari objek const dan temporaries :
Untuk membuat konstanta yang sepele tidak bisa berubah
Untuk melewati objek yang arbitrer dengan referensi alih-alih berdasarkan nilai - untuk mencegah kemungkinan by-value passing yang mahal atau tidak mungkin
sumber
Sebenarnya ada 2 penggunaan utama const di C ++.
Nilai Konst
Jika suatu nilai dalam bentuk variabel, anggota, atau parameter yang tidak akan (atau tidak boleh) diubah selama masa pakainya, Anda harus menandainya sebagai const. Ini membantu mencegah mutasi pada objek. Sebagai contoh, dalam fungsi berikut ini saya tidak perlu mengubah instance Siswa lulus jadi saya tandai itu const.
Mengapa Anda melakukan ini? Jauh lebih mudah untuk berpikir tentang suatu algoritma jika Anda tahu bahwa data yang mendasarinya tidak dapat berubah. "const" membantu, tetapi tidak menjamin ini akan tercapai.
Jelas, mencetak data ke cout tidak membutuhkan banyak pemikiran :)
Menandai metode anggota sebagai const
Pada contoh sebelumnya saya menandai Student sebagai const. Tapi bagaimana C ++ tahu bahwa memanggil metode GetName () pada siswa tidak akan bermutasi objek? Jawabannya adalah bahwa metode itu ditandai sebagai const.
Menandai metode "const" melakukan 2 hal. Terutama itu memberitahu C ++ bahwa metode ini tidak akan bermutasi objek saya. Yang kedua adalah bahwa semua variabel anggota sekarang akan diperlakukan seolah-olah mereka ditandai sebagai const. Ini membantu tetapi tidak mencegah Anda dari memodifikasi instance kelas Anda.
Ini adalah contoh yang sangat sederhana tetapi mudah-mudahan ini akan membantu menjawab pertanyaan Anda.
sumber
Berhati-hatilah untuk memahami perbedaan antara 4 deklarasi ini:
2 deklarasi berikut identik secara semantik. Anda dapat mengubah mana CCP1 dan CCP2 titik, tetapi Anda tidak dapat mengubah hal yang mereka menunjuk.
Selanjutnya, pointer adalah const, jadi agar bermakna itu harus diinisialisasi untuk menunjuk ke sesuatu. Anda tidak dapat membuatnya menunjuk ke hal lain, namun hal yang ditunjukkannya dapat diubah.
Akhirnya, kami menggabungkan keduanya - jadi benda yang diarahkan tidak dapat dimodifikasi, dan penunjuk tidak dapat menunjuk ke tempat lain.
Aturan spiral searah jarum jam dapat membantu mengurai deklarasi http://c-faq.com/decl/spiral.anderson.html
sumber
Sebagai catatan kecil, ketika saya baca di sini , ada baiknya memperhatikan hal itu
sumber