Karena cara objek Objective-C bekerja, const
menyerah menjadi penegakan dan mulai menjadi notasi untuk programmer. Pertimbangkan program ini:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
Itu sebenarnya tidak akan dikompilasi di sini (saya menggunakan dentang): kompiler dapat mendeteksi upaya untuk memodifikasi tipe C primitif dan memancarkan kesalahan. Tetapi sekarang bandingkan dengan program ini:
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
Meskipun fungsinya meneruskan pointer konstan ke objek konstan, masih mungkin untuk bermutasi objek.
Dalam pemrograman berorientasi objek, cara terbaik untuk menegakkan sifat konstan suatu objek adalah membuat objek tersebut tidak dapat diubah - yaitu tidak menyediakan metode apa pun yang dapat mengubah keadaannya. Bayangkan bahwa fungsi di atas mengambil NSString
argumen alih-alih NSMutableString
, dan bahwa saya telah melewatkan literal @"Hello"
alih-alih salinan yang dapat diubah. Saat ini, secara wajar, tidak ada peluang untuk memutasikan objek yang lewat [*]. Objective-C tidak memiliki cara untuk menegakkan itu, tidak seperti const
atau final
objek referensi dalam bahasa OO lainnya.
Sebagai perbandingan, const
bekerja sepenuhnya berbeda dalam C ++. Jika saya mendapatkan const
referensi ke objek C ++, saya hanya diizinkan memanggil const
fungsi anggota pada objek itu. Fungsi-fungsi ini menjaga const
-ness objek, baik dengan tidak membuat perubahan atau dengan hanya memodifikasi variabel anggota yang secara eksplisit telah ditandai mutable
oleh perancang kelas. Jadi bayangkan saya memiliki beberapa tipe MutableString
C ++ yang setara dengan NSMutableString
di Objective-C. Setara dengan contoh saya di atas akan terlihat seperti:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
Ini pasti tidak akan dikompilasi: selain appendString()
tidak menjadi const
operasi, fungsi menghapus const
kualifikasi dari referensi tipe yang membutuhkan a const_cast
.
[*] Saya berharap ada beberapa cara yang berbelit-belit untuk melakukannya, tetapi sekarang kita masuk ke ranah satu programmer mencoba menyabotase yang lain dengan melakukan hal-hal "pintar".