ध्यान दें कि यदि यह आपके लिए योग्य है, लेकिन मानक एमएल जैसी कार्यात्मक भाषाओं में सब कुछ डिफ़ॉल्ट रूप से अपरिवर्तनीय है। उत्परिवर्तन एक सामान्य ref
एरेस प्रकार के माध्यम से समर्थित है । तो एक int
चर अपरिवर्तनीय है, और एक ref int
चर int
s के लिए एक परिवर्तनशील कंटेनर है । असल में, चर हैं असली गणितीय अर्थ (एक अज्ञात लेकिन निश्चित मान) में चर और ref
एक स्मृति सेल कि करने के लिए लिखा जा सकता है और से पढ़ा - s "चर" जरूरी प्रोग्रामिंग अर्थ में कर रहे हैं। (मैं उन्हें असाइन करने के लिए कॉल करना पसंद करता हूं ।)
मुझे लगता है कि समस्या const
दो गुना है। सबसे पहले, C ++ में कचरा संग्रह का अभाव है, जो गैर-तुच्छ लगातार डेटा संरचनाओं के लिए आवश्यक है । किसी भी अर्थ में गहरा const
होना चाहिए, फिर भी C ++ में पूरी तरह से अपरिवर्तनीय मान होना अव्यावहारिक है।
दूसरा, C ++ में आपको const
इससे बाहर निकलने के बजाय विकल्प चुनने की जरूरत है। लेकिन जब आप const
किसी चीज़ को भूल जाते हैं और बाद में उसे ठीक कर लेते हैं, तो आप @ RobY के जवाब में बताई गई "कॉन्स्ट पॉइज़निंग" स्थिति को समाप्त कर देंगे जहाँ const
परिवर्तन पूरे कोड में कैस्केड होगा। यदि const
डिफ़ॉल्ट था, तो आप खुद को const
पीछे हटने वाला नहीं पाएंगे । इसके अतिरिक्त, const
हर जगह जोड़ने के लिए कोड के लिए बहुत शोर जोड़ता है।
मुझे संदेह है कि मुख्यधारा की भाषाओं ने (उदाहरण के लिए जावा) को C और C ++ की सफलता और सोचने के तरीके से बहुत अधिक आकार दिया था। बिंदु में मामला, यहां तक कि कचरा संग्रह के साथ अधिकांश भाषाओं के संग्रह एपीआई परस्पर डेटा संरचनाओं को मानते हैं। तथ्य यह है कि सब कुछ परिवर्तनशील और अपरिवर्तनीयता के रूप में देखा जाता है क्योंकि कोने का मामला लोकप्रिय भाषाओं के पीछे अनिवार्य मानसिकता के बारे में बोलता है।
EDIT : ग्रीनल्डमैन की टिप्पणी पर विचार करने के बाद मुझे महसूस हुआ कि const
सीधे डेटा की अपरिहार्यता के बारे में नहीं है; const
विधि के प्रकार में सांकेतिक शब्दों में बदलना है कि क्या यह उदाहरण पर दुष्प्रभाव है।
संदर्भित रूप से पारदर्शी व्यवहार प्राप्त करने के लिए म्यूटेशन का उपयोग करना संभव है । मान लीजिए कि आपके पास एक फ़ंक्शन है जिसे जब क्रमिक रूप से अलग-अलग मान लौटाते हैं - उदाहरण के लिए, एक फ़ंक्शन जो किसी एकल वर्ण को पढ़ता है stdin
। हम इस फ़ंक्शन के परिणामों को संचयित कर सकते हैं / मानों के संदर्भ में पारदर्शी प्रवाह उत्पन्न करने के लिए इस फ़ंक्शन के परिणामों को याद कर सकते हैं। स्ट्रीम एक लिंक की गई सूची होगी, जिसके नोड्स फ़ंक्शन को पहली बार कॉल करेंगे जब आप उनके मूल्य को पुनः प्राप्त करने का प्रयास करेंगे, लेकिन फिर परिणाम को कैश करें। तो अगर stdin
constains Hello, world!
, पहली बार जब आप पहली नोड के मूल्य प्राप्त करने का प्रयास है, यह एक पढ़ेंगे char
और बदले H
। बाद में यह H
आगे पढ़ने के लिए कॉल के बिना लौटना जारी रखेगा char
। इसी तरह, दूसरा नोड एक char
से पढ़ेगाstdin
पहली बार जब आप इसके मूल्य को पुनः प्राप्त करने का प्रयास करते हैं, तो इस बार लौटते हैं e
और उस परिणाम को कैशिंग करते हैं।
यहाँ दिलचस्प बात यह है कि आपने एक ऐसी प्रक्रिया को बदल दिया है जो स्वाभाविक रूप से एक वस्तु में स्टेटफुल है जो प्रतीत होता है कि स्टेटलेस है। हालांकि, इसे प्राप्त करने के लिए ऑब्जेक्ट की आंतरिक स्थिति (परिणामों को कैशिंग करके) को म्यूट करना आवश्यक था - म्यूटेशन एक सौम्य प्रभाव था । CharStream
const
भले ही धारा अपरिवर्तनीय मूल्य की तरह व्यवहार करती है , यह हमारे लिए असंभव है । अब कल्पना करें कि विधियों के Stream
साथ एक इंटरफ़ेस है const
, और आपके सभी कार्यों की उम्मीद है const Streams
। आपका CharStream
इंटरफ़ेस लागू नहीं कर सकता!
( संस्करण 2: जाहिर है कि C ++ कीवर्ड कहा जाता है mutable
जो हमें धोखा देने और बनाने की अनुमति देगाCharStream
const
। हालांकि, यह खामियों की const
गारंटी देता है - अब आप वास्तव में सुनिश्चित नहीं हो सकते कि कुछ इसके const
तरीकों के माध्यम से उत्परिवर्तित नहीं होगा । मुझे लगता है कि यह नहीं है। बुरा आप स्पष्ट रूप से बचाव का अनुरोध करना चाहिए, लेकिन आप अभी भी पूरी तरह से सम्मान प्रणाली पर निर्भर हैं।
दूसरे, मान लीजिए कि आपके पास उच्च-क्रम के कार्य हैं - अर्थात, आप कार्यों को अन्य कार्यों के तर्क के रूप में पारित कर सकते हैं। const
नेस एक फंक्शन के सिग्नेचर का हिस्सा है, इसलिए आप नॉन- const
फंक्शन्स को उन फंक्शन के लिए पास नहीं कर पाएंगे जो const
फंक्शन्स की अपेक्षा रखते हैं। अंधाधुंध const
यहां लागू करने से व्यापकता का नुकसान होगा।
अंत में, किसी const
ऑब्जेक्ट में हेरफेर करने की गारंटी नहीं है कि यह आपकी पीठ के पीछे कुछ बाहरी (स्थिर या वैश्विक) स्थिति को उत्परिवर्तित नहीं कर रहा है, इसलिए const
गारंटी के रूप में वे शुरू में मजबूत नहीं होते हैं।
यह मेरे लिए स्पष्ट नहीं है कि प्रकार की प्रणाली में साइड इफेक्ट्स की उपस्थिति या अनुपस्थिति को एन्कोडिंग सार्वभौमिक रूप से एक अच्छी बात है।