Saya punya pertanyaan dasar tentang petunjuk const. Saya tidak diizinkan untuk memanggil fungsi non-anggota const menggunakan pointer const. Namun, saya diizinkan melakukan ini pada pointer const:
delete p;
Ini akan memanggil destruktor kelas yang pada dasarnya adalah 'metode' non-const. Mengapa ini diperbolehkan? Apakah hanya untuk mendukung ini:
delete this;
Atau ada alasan lain?
c++
constants
delete-operator
Naveen
sumber
sumber
const Foo * f
atauFoo const * f
bukan merupakan pointer const ke Foo. Ini lebih mengarah ke const Foo.Foo * const f
adalah pointer const ke Foo.Begini - jika tidak diizinkan, tidak akan ada cara untuk menghapus objek const tanpa menggunakan const_cast.
Secara semantik, const adalah indikasi bahwa suatu objek harus tetap. Namun, itu tidak berarti bahwa objek tersebut tidak boleh dihapus.
sumber
Ya, kamu.
class Foo { public: void aNonConstMemberFunction(); }; Foo* const aConstPointer = new Foo; aConstPointer->aNonConstMemberFunction(); // legal const Foo* aPointerToConst = new Foo; aPointerToConst->aNonConstMemberFunction(); // illegal
Anda telah membingungkan penunjuk const ke objek non-const, dengan penunjuk non-const ke objek const.
Karena itu,
delete aConstPointer; // legal delete aPointerToConst; // legal
sah juga untuk menghapus, karena alasan yang sudah disebutkan oleh jawaban lain di sini.
sumber
Pembuat dan Penghancur tidak boleh dipandang sebagai 'metode'. Mereka adalah konstruksi khusus untuk menginisialisasi dan merobohkan objek kelas.
'const pointer' adalah untuk menunjukkan bahwa status objek tidak akan berubah ketika operasi dilakukan pada objek tersebut saat masih hidup.
sumber
Cara lain untuk melihatnya: arti yang tepat dari sebuah pointer const adalah bahwa Anda tidak akan dapat membuat perubahan pada objek yang diarahkan ke yang akan terlihat melalui itu atau pointer atau referensi lain ke objek yang sama. Namun saat sebuah objek hancur, semua penunjuk lain ke alamat yang sebelumnya ditempati oleh objek yang sekarang dihapus tidak lagi menjadi penunjuk ke objek itu . Mereka menyimpan alamat yang sama, tetapi alamat itu bukan lagi alamat objek apa pun (sebenarnya alamat itu mungkin akan segera digunakan kembali sebagai alamat objek yang berbeda).
Perbedaan ini akan lebih jelas jika pointer dalam C ++ berperilaku seperti referensi yang lemah, yaitu segera setelah objek dimusnahkan, semua pointer yang masih ada akan segera disetel ke
0
. (Itu adalah jenis hal yang dianggap terlalu mahal pada waktu proses untuk diterapkan pada semua program C ++, dan pada kenyataannya tidak mungkin membuatnya sepenuhnya dapat diandalkan.)PEMBARUAN : Membaca ini kembali sembilan tahun kemudian, itu adalah pengacara. Sekarang saya menemukan reaksi asli Anda dapat dimengerti. Untuk melarang mutasi tetapi membiarkan kehancuran jelas bermasalah. Kontrak tersirat dari pointer / referensi const adalah bahwa keberadaan mereka akan bertindak sebagai penghambat penghancuran objek target, alias pengumpulan sampah otomatis.
Solusi yang biasa untuk ini adalah dengan menggunakan hampir semua bahasa lain.
sumber
std::unique_ptr<const T>
akhir dari hidup itu?