Karena cara objek Objective-C bekerja, constmenyerah 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 NSStringargumen 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 constatau finalobjek referensi dalam bahasa OO lainnya.
Sebagai perbandingan, constbekerja sepenuhnya berbeda dalam C ++. Jika saya mendapatkan constreferensi ke objek C ++, saya hanya diizinkan memanggil constfungsi 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 mutableoleh perancang kelas. Jadi bayangkan saya memiliki beberapa tipe MutableStringC ++ yang setara dengan NSMutableStringdi 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 constoperasi, fungsi menghapus constkualifikasi 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".