जिस तरह से ऑब्जेक्टिव-सी ऑब्जेक्ट्स काम करते हैं, उसके const
कारण एक प्रवर्तन होता है और प्रोग्रामर के लिए एक संकेतन होने लगता है। इस कार्यक्रम पर विचार करें:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
यह वास्तव में यहाँ संकलन नहीं होगा (मैं क्लैंग का उपयोग कर रहा हूँ): कंपाइलर आदिम सी प्रकार को संशोधित करने के प्रयास का पता लगा सकता है और एक त्रुटि का उत्सर्जन करता है। लेकिन अब इस कार्यक्रम से इसकी तुलना करें:
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;
}
भले ही फ़ंक्शन किसी स्थिर ऑब्जेक्ट के लिए एक निरंतर पॉइंटर पारित किया गया हो, फिर भी ऑब्जेक्ट को म्यूट करना संभव है।
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, किसी वस्तु की निरंतर प्रकृति को लागू करने का सबसे अच्छा तरीका उस वस्तु को अपरिवर्तनीय बनाना है - अर्थात ऐसी कोई भी विधि प्रदान न करें जो उसके राज्य को बदल सके। कल्पना कीजिए कि ऊपर के फ़ंक्शन ने NSString
इसके बजाय एक तर्क लिया NSMutableString
, और यह कि मैं @"Hello"
एक म्यूट कॉपी के बजाय शाब्दिक रूप से पास हो गया । अब, यथोचित रूप से बोल रहा है, पास किए गए ऑब्जेक्ट को बदलने का कोई मौका नहीं है [*]। ऑब्जेक्टिव-सी का अन्य ओओ भाषाओं में संदर्भ const
या final
ऑब्जेक्ट के विपरीत, हालांकि, इसे लागू करने का कोई तरीका नहीं है ।
तुलना के लिए, const
C ++ में पूरी तरह से अलग तरह से काम करता है। यदि मुझे const
C ++ ऑब्जेक्ट का संदर्भ मिलता है , तो मुझे केवल const
उस ऑब्जेक्ट पर सदस्य फ़ंक्शन को कॉल करने की अनुमति है । ये फ़ंक्शन const
ऑब्जेक्ट की -नेस को संरक्षित करते हैं , या तो कोई परिवर्तन नहीं करते हैं या केवल सदस्य चर को संशोधित करके जो स्पष्ट रूप mutable
से क्लास डिजाइनर द्वारा चिह्नित किए गए हैं। तो कल्पना कीजिए कि मेरे पास MutableString
C ++ में कुछ प्रकार है जो कि NSMutableString
Objective-C के बराबर है। ऊपर मेरे उदाहरण के बराबर कुछ इस तरह दिखेगा:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
यह निश्चित रूप से संकलित नहीं करेगा: appendString()
एक const
ऑपरेशन नहीं होने के अलावा , फ़ंक्शन const
क्वालिफायर को उस प्रकार के संदर्भ से हटा देता है जिसके लिए ए की आवश्यकता होती है const_cast
।
[*] मुझे उम्मीद है कि इसे करने का कुछ विपरीत तरीका है, लेकिन अब हम एक प्रोग्रामर के दायरे में हैं, जो "चतुर" चीजों को करने के लिए दूसरे को तोड़फोड़ करने की कोशिश कर रहे हैं।