Objective-C nesnelerinin çalışma şekli nedeniyle, const
bir yaptırımdan vazgeçer ve programcı için bir gösterim olmaya başlar. Bu programı düşünün:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
Bu aslında burada derlenmeyecek (clang kullanıyorum): derleyici ilkel C tipini değiştirme girişimini tespit edebilir ve bir hata yayar. Ama şimdi bu programla karşılaştırın:
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;
}
İşlev sabit bir nesneye sabit bir işaretçi geçirilmesine rağmen, nesneyi değiştirmek hala mümkündür.
Nesne yönelimli programlamada, bir nesnenin sabit doğasını zorlamanın en iyi yolu, o nesneyi değişmez yapmaktır - yani durumunu değiştirebilecek herhangi bir yöntem sunmamaktır. Yukarıdaki işlevin NSString
bunun yerine bir argüman aldığını NSMutableString
ve @"Hello"
değişebilir bir kopya yerine değişmez kelimeyi geçtiğimi düşünün . Artık, makul bir şekilde, içeri giren nesneyi mutasyona uğratma şansı yoktur [*]. Objective-C'nin diğer OO dillerinden farklı olarak const
ya da final
nesne referanslarından farklı olarak herhangi bir zorlama yolu yoktur .
Karşılaştırma için, const
C ++ 'da tamamen farklı çalışır. Bir alırsanız const
bir C ++ nesneye başvuru, sadece çağrı izin var const
o nesne üzerinde üye fonksiyonları. Bu işlevler const
, herhangi bir değişiklik yapmadan veya yalnızca mutable
sınıf tasarımcısı tarafından açıkça işaretlenmiş üye değişkenleri değiştirerek nesnenin -ness'ini korur . Öyleyse MutableString
, C ++ 'da NSMutableString
Objective-C'ye eşdeğer bir tipim olduğunu hayal edin . Yukarıdaki örneğimin eşdeğeri şöyle görünecektir:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
Bu kesinlikle derlenmeyecektir: appendString()
bir const
işlem olmamasına ek olarak , işlev const
niteleyiciyi a gerektiren tür referansından kaldırır const_cast
.
[*] Bunu yapmanın bir şekilde çarpıtılmış bir yolu olmasını bekliyorum, ama şimdi bir programcının "akıllı" şeyler yaparak sabote etmeye çalışan alemlerine giriyoruz.