अस्वीकरण: मुझे पता है कि कॉन्स्ट-शुद्धता की उपयोगिता के बारे में दो प्रश्न हैं, हालांकि, किसी ने भी चर्चा नहीं की कि सी ++ में अन्य प्रोग्रामिंग भाषाओं के विपरीत कॉन्स्ट-शुद्धता आवश्यक है। इसके अलावा, मैं इन सवालों के जवाब दिए गए उत्तरों से संतुष्ट नहीं हूं।सी ++ के लिए विशिष्ट कॉन्स्ट-क्वालिटी क्यों है?
मैंने अब कुछ प्रोग्रामिंग भाषाओं का उपयोग किया है, और एक चीज जो मुझे सी ++ में बग करता है वह कॉन्स्ट-शुद्धता की धारणा है। जावा, सी #, पायथन, रूबी, विजुअल बेसिक इत्यादि में ऐसी कोई धारणा नहीं है, यह सी ++ के लिए बहुत विशिष्ट है।
इससे पहले कि आप मुझे सी ++ एफएक्यू लाइट में देखें, मैंने इसे पढ़ लिया है, और यह मुझे विश्वास नहीं करता है। पूरी तरह से वैध, भरोसेमंद प्रोग्राम हर समय पायथन में लिखे जाते हैं, और कोई कॉन्स कीवर्ड या समतुल्य नहीं होता है। जावा और सी # में, वस्तुओं को अंतिम (या कॉन्स) घोषित किया जा सकता है, लेकिन कोई कॉन्स्ट सदस्य फ़ंक्शन या कॉन्स्ट फ़ंक्शन पैरामीटर नहीं हैं। यदि किसी फ़ंक्शन को किसी ऑब्जेक्ट को संशोधित करने की आवश्यकता नहीं है, तो यह एक इंटरफ़ेस ले सकता है जो केवल ऑब्जेक्ट को पढ़ने की पहुंच प्रदान करता है। उस तकनीक को सी ++ में समान रूप से उपयोग किया जा सकता है। मैंने जिन दो वास्तविक दुनिया सी ++ प्रणालियों पर काम किया है, वहां कहीं भी कॉन्स का बहुत कम उपयोग था, और सबकुछ ठीक काम करता था। तो मैं एक कोडेबेस दूषित करने की अनुमति देने की उपयोगिता पर बेचा से दूर हूँ।
मुझे आश्चर्य है कि सी ++ में यह क्या है जो अन्य प्रोग्रामिंग भाषाओं के विपरीत आवश्यक है, ।
अब तक, मैं केवल एक मामले में जहां स्थिरांक इस्तेमाल किया जाना चाहिए देखा है:
#include <iostream>
struct Vector2 {
int X;
int Y;
};
void display(/* const */ Vector2& vect) {
std::cout << vect.X << " " << vect.Y << std::endl;
}
int main() {
display(Vector2());
}
साथ स्थिरांक बाहर टिप्पणी की विजुअल स्टूडियो द्वारा स्वीकार किया जाता इस संकलन है, लेकिन चेतावनी C4239, गैर मानक के साथ विस्तार का इस्तेमाल किया। इसलिए, यदि आप अस्थायी में गुजरने, प्रतियों से परहेज करने और मानक-अनुपालन में रहने की सिंटैक्टिक ब्रेवटी चाहते हैं, तो आपको इसके आसपास कोई रास्ता नहीं है, इसके विपरीत कोई भी रास्ता नहीं है। फिर भी, यह एक मौलिक कारण की तुलना में एक quirk की तरह है।
अन्यथा, वास्तव में ऐसी स्थिति नहीं है जहां कॉन्स्ट का उपयोग किया जाना चाहिए, सिवाय इसके कि जब कॉन्स्ट का उपयोग करने वाले अन्य कोड के साथ इंटरफेसिंग करते हैं।
कारण यह है कि सी ++ में स्थिरांक काम करता है है, क्योंकि आप इसे दूर डाली कर सकते हैं: कॉन्स्ट थोड़ा एक स्वयं धर्मी प्लेग है कि सब कुछ को स्पर्श करने के लिए फैलता है की तुलना में और मुझे लगता है। यदि आप इसे दूर नहीं कर सका, तो आपकी दुनिया चूस जाएगी। यदि आप एक विधि घोषित करते हैं जो एक कॉन्स ब्लैस लेता है, तो आप को एक गैर-कॉन्स्टा ब्लै पास कर सकते हैं। लेकिन अगर यह आपके आस-पास के अन्य तरीकों से नहीं हो सकता है। यदि आप एक ऐसी विधि घोषित करते हैं जो गैर-कॉन्स्टा ब्लैड लेता है, तो आप इसे कॉन्स्ट ब्लै पास नहीं कर सकते हैं। तो अब आप अटक गए हैं। तो आप धीरे-धीरे की कॉन्स संस्करण की आवश्यकता है जो कि स्थिर नहीं है, और आप छाया छाया के साथ समाप्त हो जाते हैं। सी ++ में आप इससे दूर हो जाते हैं, क्योंकि सी ++ में कुछ भी यह पूरी तरह से वैकल्पिक है चाहे आप यह चेक चाहते हैं या नहीं। यदि आप इसे पसंद नहीं करते हैं तो आप केवल को स्थिरता को दूर कर सकते हैं।
एंडर्स हेल्स्बर्ग (सी # वास्तुकार), CLR Design Choices
हेजल्सबर्ग पूरी तरह से सही नहीं है (सामान्य रूप से, गैर-सी ++ प्रोग्रामर पर भरोसा न करें, सी ++ डिज़ाइन निर्णयों के बारे में तर्कसंगत बनाने के लिए। यह हमेशा गलत होता है)। सी ++ आपको आसानी से कॉन्स्टेस को दूर करने की अनुमति नहीं देता है। यदि एक चर को कॉन्स के रूप में घोषित किया जाता है, तो यह * स्थिर रहता है, और आपको स्थिरता को दूर करने की अनुमति नहीं है। लेकिन यदि आप एक गैर-कॉन्स ऑब्जेक्ट लेते हैं, जो पूरी तरह से कॉन्स को बढ़ावा देता है, तो आपको कॉन्स्टेस को दूर करने की अनुमति है। – jalf
नई डी भाषा में सी ++ में कॉन्स जैसी कई कार्यात्मक संरचनाएं हैं। आजकल ओओपी अतिरंजित है। – GogaRieger
मुझे लगता है कि एंडर्स के पास एक बिंदु है: आपको हमेशा कॉन्स को दूर करने की अनुमति दी जाती है। यदि वस्तु वास्तव में स्थिर है तो आपको इसे लिखने की अनुमति नहीं है। मेरे छोटे जीवन में एक सी ++ प्रोग्रामर के रूप में मेरे पास केवल एक अवसर था जहां मुझे दूर कास्ट करने की आवश्यकता थी ('wxStyledTextCtrl' में इसकी सभी 'GetXXX' विधियां गैर-कॉन्स हैं!)। अगर सी ++ ने मुझे ऐसा करने की अनुमति नहीं दी, तो मैं उस क्रैपी एपीआई से फंस गया होता और इसे अपने क्लास डिज़ाइन को संक्रमित करने देता। –