Saya akan berbicara dengan C ++, di mana perbedaan ini paling relevan.
Seperti yang Anda catat dengan benar, kekekalan berarti bahwa suatu objek tidak dapat berubah sama sekali setelah penciptaannya. Penciptaan ini tentu saja dapat terjadi pada saat runtime, yaitu, suatu const
objek tidak harus berupa konstanta waktu kompilasi. Dalam C ++, objek tidak dapat diubah jika (1) dan (2) atau (3) terpenuhi:
Itu tidak memiliki anggota menyatakan mutable
yang dimutasi oleh const
fungsi anggota
Dinyatakan const
const
fungsi anggota tidak digunakan const_cast
untuk menghapus const
kualifikasi untuk mengubah anggota mana pun
Namun, Anda juga dapat mempertimbangkan pengubah akses: jika suatu operasi secara internal mengubah sebuah instance, tetapi tidak memiliki efek pada keadaan instance yang dapat diamati melalui antarmuka publiknya, maka objek tersebut “secara logika tidak dapat diubah”.
Jadi C ++ menyediakan alat yang diperlukan untuk membuat objek yang tidak dapat diubah, tetapi seperti kebanyakan semua yang ada di C ++, alat tersebut hanya cukup memadai, dan membutuhkan ketekunan untuk benar-benar menggunakannya. Keadaan instance tidak harus terbatas pada variabel anggota instance — karena C ++ tidak menyediakan cara untuk menegakkan transparansi referensial, ia dapat menyertakan status global atau kelas juga.
const
juga memiliki fungsi lain di C ++: untuk memenuhi syarat referensi dan petunjuk. Sebuah const
referensi dapat merujuk ke non const
objek. Adalah sah (meskipun tidak secara umum tidak perlu atau disarankan) untuk digunakan const_cast
untuk memutasi suatu objek melalui const
referensi, jika dan hanya jika objek tersebut dinyatakan non- const
:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
Dan tentu saja itu perilaku yang tidak terdefinisi untuk bermutasi const
objek:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
tidak ada di setiap bahasa, dan ketidakmampuan dan keabadian tidak ada di setiap bahasa sehingga membuat bahasa ini agonistik tidak berlaku. Ini hanya khusus bahasa di mana konsep-konsep ini berlaku.