C ++ को लाने में क्या समस्याएं हैं - जैसे भाषा में कास्ट?


17

मुझे C ++ के विचार में दिलचस्पी है - जैसे constकि विशेष निष्पादन नहीं (जैसे दूर कास्टिंग const)।

उदाहरण के लिए C # ले लो - इसमें C ++ की कमी है, जैसे const, और इसका कारण सामान्य है - लोग और समय। यहाँ अतिरिक्त रूप से ऐसा लगता है कि C # टीम ने C ++ के निष्पादन को देखा const, सीएलआर की मार्केटिंग की और इस बिंदु पर पर्याप्त था (देखें कि c # और कांस्टैशनल पैरामीटर में कोई कास्ट मेंबर विधि क्यों नहीं है ? धन्यवाद Svick)। अगर हम इससे आगे बढ़ते हैं, तो क्या कुछ और है?

क्या कुछ गहरा है? उदाहरण के लिए मल्टी-इनहेरिटेंस लें - यह आमतौर पर (उपयोगकर्ता के लिए) समझ के लिए कठिन के रूप में देखा जाता है और इस तरह भाषा में नहीं जोड़ा जाता है (जैसे हीरे की समस्या)।

क्या उस प्रकृति की प्रकृति में कुछ है , constजो भाषा से बचने के लिए बेहतर है? अगर constगहरी या उथली होनी चाहिए तो यह तय करने जैसा कुछ है कि constक्या इसका मतलब है कि मैं नए तत्व नहीं जोड़ सकता या मौजूदा तत्वों को भी बदल सकता हूँ? क्या होगा अगर तत्व संदर्भ प्रकार के हैं)?

अद्यतन : जब मैं सी # का उल्लेख करता हूं, और इस प्रकार एक ऐतिहासिक परिप्रेक्ष्य बना रहा हूं, constजो भाषा की संभावित समस्याओं की प्रकृति में दिलचस्पी रखता है ।

यह भाषाओं की चुनौती नहीं है। कृपया वर्तमान रुझान या लोकप्रियता के रूप में ऐसे कारकों को अनदेखा करें - मुझे केवल तकनीकी मुद्दों में दिलचस्पी है - धन्यवाद।


3
एक तरफ के रूप में: कई वंशानुक्रम को समझना मुश्किल नहीं हो सकता है, लेकिन विधि संकल्प काफी बदसूरत हो सकता है। Naive गहराई-पहला रिज़ॉल्यूशन तेज़ी से अनइंस्टिट्यूट (" हीरे की समस्या ") बन जाता है । सी 3 विधि संकल्प आदेश (प्रकाशित '96) इस को हल करती है, लेकिन निश्चित रूप से है नहीं आसान समझने के लिए। इसलिए कई विरासत को रेखांकित करना अक्सर काफी समझदार लग सकता है - लेकिन असली समस्या यह है कि जावा C3 एल्गोरिथ्म से पहले है, और C # जावा के बाद खुद को उन्मुख करता है।
आमोन

3
@amon बहुत से लोग वास्तव में यह नहीं सोचते हैं कि एकाधिक उत्तराधिकार वह विशेषता है जिसे आप पहली जगह में रखना चाहते हैं, जैसे डी प्रोग्रामिंग की रचनाकार हैं: यह विवादास्पद मूल्य की एक जटिल विशेषता है। एक कुशल तरीके से इसे लागू करना बहुत मुश्किल है, और इसे लागू करने में कई कीड़े होने की संभावना है। MI के लगभग सभी मूल्य को एकल विरासत के साथ इंटरफेस और एकत्रीकरण के साथ संभाला जा सकता है। जो कुछ बचा है वह एमआई कार्यान्वयन के वजन को सही नहीं करता है। (स्रोत)
jcora

5
का डुप्लीकेट stackoverflow.com/q/4150478/41071
svick

2
मल्टीपल इनहेरिटेंस के बिना भी , आप पहले से ही C # में विधि संकल्प (या अधिक सटीक अधिभार संकल्प) के रूप में किसी भी 3-SAT समस्या को सांकेतिक शब्दों में बदलना कर सकते हैं , इस प्रकार यह एनपी-पूर्ण बना सकता है।
जोर्ग डब्ल्यू मित्तग

1
@svick, बहुत-बहुत धन्यवाद। चूँकि इस प्रश्न के लिए मेरे पास कोई उत्तर नहीं था इसलिए मैंने इसे भारी मात्रा में संपादित करने की स्वतंत्रता ली, समस्या की प्रकृति पर ध्यान केंद्रित करने के लिए, ऐतिहासिक कारणों से नहीं, क्योंकि ऐसा लगता है कि उनमें से 99% "समय + लोग + विरोधी सी ++ पूर्वाग्रह थे। + CLR "।
ग्रीनोल्डमैन

जवाबों:


10

ध्यान दें कि यदि यह आपके लिए योग्य है, लेकिन मानक एमएल जैसी कार्यात्मक भाषाओं में सब कुछ डिफ़ॉल्ट रूप से अपरिवर्तनीय है। उत्परिवर्तन एक सामान्य refएरेस प्रकार के माध्यम से समर्थित है । तो एक intचर अपरिवर्तनीय है, और एक ref intचर ints के लिए एक परिवर्तनशील कंटेनर है । असल में, चर हैं असली गणितीय अर्थ (एक अज्ञात लेकिन निश्चित मान) में चर और refएक स्मृति सेल कि करने के लिए लिखा जा सकता है और से पढ़ा - s "चर" जरूरी प्रोग्रामिंग अर्थ में कर रहे हैं। (मैं उन्हें असाइन करने के लिए कॉल करना पसंद करता हूं ।)

मुझे लगता है कि समस्या constदो गुना है। सबसे पहले, C ++ में कचरा संग्रह का अभाव है, जो गैर-तुच्छ लगातार डेटा संरचनाओं के लिए आवश्यक है । किसी भी अर्थ में गहरा const होना चाहिए, फिर भी C ++ में पूरी तरह से अपरिवर्तनीय मान होना अव्यावहारिक है।

दूसरा, C ++ में आपको constइससे बाहर निकलने के बजाय विकल्प चुनने की जरूरत है। लेकिन जब आप constकिसी चीज़ को भूल जाते हैं और बाद में उसे ठीक कर लेते हैं, तो आप @ RobY के जवाब में बताई गई "कॉन्स्ट पॉइज़निंग" स्थिति को समाप्त कर देंगे जहाँ constपरिवर्तन पूरे कोड में कैस्केड होगा। यदि constडिफ़ॉल्ट था, तो आप खुद को constपीछे हटने वाला नहीं पाएंगे । इसके अतिरिक्त, constहर जगह जोड़ने के लिए कोड के लिए बहुत शोर जोड़ता है।

मुझे संदेह है कि मुख्यधारा की भाषाओं ने (उदाहरण के लिए जावा) को C और C ++ की सफलता और सोचने के तरीके से बहुत अधिक आकार दिया था। बिंदु में मामला, यहां तक ​​कि कचरा संग्रह के साथ अधिकांश भाषाओं के संग्रह एपीआई परस्पर डेटा संरचनाओं को मानते हैं। तथ्य यह है कि सब कुछ परिवर्तनशील और अपरिवर्तनीयता के रूप में देखा जाता है क्योंकि कोने का मामला लोकप्रिय भाषाओं के पीछे अनिवार्य मानसिकता के बारे में बोलता है।

EDIT : ग्रीनल्डमैन की टिप्पणी पर विचार करने के बाद मुझे महसूस हुआ कि constसीधे डेटा की अपरिहार्यता के बारे में नहीं है; constविधि के प्रकार में सांकेतिक शब्दों में बदलना है कि क्या यह उदाहरण पर दुष्प्रभाव है।

संदर्भित रूप से पारदर्शी व्यवहार प्राप्त करने के लिए म्यूटेशन का उपयोग करना संभव है । मान लीजिए कि आपके पास एक फ़ंक्शन है जिसे जब क्रमिक रूप से अलग-अलग मान लौटाते हैं - उदाहरण के लिए, एक फ़ंक्शन जो किसी एकल वर्ण को पढ़ता है stdin। हम इस फ़ंक्शन के परिणामों को संचयित कर सकते हैं / मानों के संदर्भ में पारदर्शी प्रवाह उत्पन्न करने के लिए इस फ़ंक्शन के परिणामों को याद कर सकते हैं। स्ट्रीम एक लिंक की गई सूची होगी, जिसके नोड्स फ़ंक्शन को पहली बार कॉल करेंगे जब आप उनके मूल्य को पुनः प्राप्त करने का प्रयास करेंगे, लेकिन फिर परिणाम को कैश करें। तो अगर stdinconstains 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गारंटी के रूप में वे शुरू में मजबूत नहीं होते हैं।

यह मेरे लिए स्पष्ट नहीं है कि प्रकार की प्रणाली में साइड इफेक्ट्स की उपस्थिति या अनुपस्थिति को एन्कोडिंग सार्वभौमिक रूप से एक अच्छी बात है।


1
+1 धन्यवाद। अपरिवर्तनीय वस्तुएं सी ++ कॉन्स्टल की तुलना में कुछ और हैं (यह एक दृश्य का अधिक है)। लेकिन कहते हैं, सी ++ डिफ़ॉल्ट रूप से होगा, और varमांग पर केवल एक ही समस्या - गहराई छोड़ देंगे?
ग्रीनोल्डमैन

1
@greenoldman अच्छी बात है। जब से मैंने C ++ का उपयोग किया है तब से यह एक समय हो गया है इसलिए मैं भूल गया कि आप constएक गैर- constऑब्जेक्ट के लिए एक संदर्भ हो सकते हैं । फिर भी, मेरा मानना ​​है कि उथले होने का कोई मतलब नहीं है const। पूरे बिंदु की constगारंटी यह है कि आप उस संदर्भ के माध्यम से वस्तु को संशोधित करने में सक्षम नहीं होंगे। आपको constएक गैर- constसंदर्भ बनाकर दरकिनार करने की अनुमति नहीं है , इसलिए constऑब्जेक्ट के सदस्यों को म्यूट करके इसे ठीक करना क्यों ठीक होगा ?
डोभाल

+1 :-) आपके अपडेट में बहुत दिलचस्प मुद्दे (नॉन / कांस्ट लैंबडास के साथ रहना और बाहरी राज्य के साथ शायद कमजोर समस्या), मुझे अब और अधिक समय तक पचाना होगा। वैसे भी, आपकी टिप्पणी के लिए मेरे मन में कुछ भी बुराई नहीं है - इसके विपरीत, मैं कोड की स्पष्टता बढ़ाने के लिए सुविधाओं की तलाश कर रहा हूं (एक अन्य: गैर-शून्य संकेत)। यहाँ एक ही श्रेणी (कम से कम यह मेरा उद्देश्य है) - मैं परिभाषित करता हूं func foo(const String &s)और यह एक संकेत है जिसे में sनहीं बदला जाएगा foo
ग्रीनोल्डमैन

1
@ग्रीनॉल्डमैन मैं निश्चित रूप से अपील और औचित्य देख सकता हूं। हालाँकि, मुझे नहीं लगता कि उत्परिवर्तित स्थिति से बचने के अलावा समस्या के लिए एक वास्तविक समाधान भी है (साथ ही अन्य गैर-जरूरी चीजें जैसे nullविरासत और विरासत।)
डोवल

8

मुख्य समस्या यह है कि प्रोग्रामर इसे पर्याप्त रूप से उपयोग नहीं करते हैं, इसलिए जब वे ऐसी जगह मारते हैं जहां इसकी आवश्यकता होती है, या एक अनुचर बाद में कांस्ट-शुद्धता को ठीक करना चाहता है, तो एक विशाल लहर प्रभाव होता है। आप अभी भी पूरी तरह से अच्छे अपरिवर्तनीय कोड के बिना लिख ​​सकते हैं const, आपका कंपाइलर सिर्फ इसे लागू नहीं करेगा, और इसके लिए अधिक कठिन समय का अनुकूलन होगा। कुछ लोग अपने संकलक को पसंद करते हैं कि वे उनकी मदद न करें। मैं उन लोगों को नहीं समझता, लेकिन उनमें से एक बहुत हैं।

कार्यात्मक भाषाओं में, बहुत कुछ सब कुछ है const, और अगर यह बिल्कुल भी अनुमति दी जाती है, तो परिवर्तनशील होना दुर्लभ अपवाद है। इसके कई फायदे हैं, जैसे कि सुगम संगामिति और साझा स्थिति के बारे में आसान तर्क, लेकिन अगर आप एक उत्परिवर्ती संस्कृति के साथ एक भाषा से आ रहे हैं, तो कुछ उपयोग होने लगते हैं। दूसरे शब्दों में, न चाहते हुए constभी लोगों का मुद्दा है, तकनीकी नहीं।


+1 धन्यवाद। जबकि अपरिवर्तनीय वस्तु कुछ और है जिसकी मैं तलाश कर रहा हूं (आप वस्तु को C # या जावा में अपरिवर्तनीय बना सकते हैं), यहां तक ​​कि अपरिवर्तनीय दृष्टिकोण के साथ भी आपको यह तय करना होगा कि क्या यह गहरा है या उथला है, उदाहरण के लिए बिंदुओं / संदर्भों के कंटेनर (आप कर सकते हैं) वस्तुओं के मूल्य में परिवर्तन होना)। एक दिन के बाद ऐसा लगता है कि प्रमुख समस्या यह है कि क्या डिफ़ॉल्ट के रूप में सेट किया गया है, और नई भाषा को डिज़ाइन करते समय यह आसानी से हल किया जा सकता है।
ग्रीनोल्डमैन

1
लोलज़ @ के लिए +1 "कुछ लोग अपने कंपाइलर को पसंद करते हैं कि वे उनकी मदद न करें। मैं उन लोगों को नहीं समझता, लेकिन उनमें से बहुत सारे हैं।"
थॉमस ईडिंग

6

मैं इस प्रकार कमियां देखता हूं:

  • "कॉन्स्ट पॉइज़निंग" एक समस्या है जब कॉन्स्ट का एक डिक्लेरेशन, कास्ट का उपयोग करने के लिए पिछली या निम्न घोषणा को बाध्य कर सकता है, और इससे कॉन्सट का उपयोग करने के लिए निम्नलिखित घोषणाओं के अपने पिछले का कारण बन सकता है, आदि और अगर कॉन्स्ट ज़हरिंग एक पुस्तकालय में एक कक्षा में बहती है। आपका नियंत्रण नहीं है, तो आप एक बुरी जगह पर फंस सकते हैं।

  • यह एक पूर्ण गारंटी नहीं है। आमतौर पर ऐसे मामले होते हैं जहां कॉन्स्ट केवल संदर्भ की रक्षा करता है, लेकिन एक या किसी अन्य कारण से अंतर्निहित मूल्यों की रक्षा करने में असमर्थ है। C में भी, ऐसे किनारे मामले हैं जो const को नहीं मिल सकते हैं, जो उस वादे को कमजोर करता है जो const प्रदान करता है।

  • सामान्य तौर पर, उद्योग की भावना मजबूत संकलन-समय की गारंटी से दूर जा रही है, हालांकि वे आपको बहुत आराम दे सकते हैं और मैं। इसलिए दोपहर के लिए मैं अपने 66% कोड को छूने के लिए खर्च करता हूं क्योंकि कब्ज, कुछ पायथन आदमी ने 10 पूरी तरह से काम करने योग्य, अच्छी तरह से डिज़ाइन किए गए, अच्छी तरह से परीक्षण किए गए, पूरी तरह कार्यात्मक पायथन मॉड्यूल को टक्कर मार दी है। और जब उसने ऐसा किया तो वह हैकिंग भी नहीं कर रहा था।

तो शायद सवाल यह है कि क्यों एक संभावित विवादास्पद विशेषता को आगे बढ़ाया जाए, यहां तक ​​कि कुछ विशेषज्ञ भी इस बारे में अस्पष्ट हैं कि आप अपनी नई भाषा को अपनाने की कोशिश कब कर रहे हैं?

संपादित करें: संक्षिप्त उत्तर, एक नई भाषा में गोद लेने के लिए चढ़ाई करने के लिए एक खड़ी पहाड़ी है। इसे अपनाने के लिए किन विशेषताओं की आवश्यकता है, इसके बारे में डिजाइनरों को वास्तव में सख्त सोचने की आवश्यकता है। उदाहरण के लिए, जाओ। Google ने कुछ कॉनन-इन-बारबेरियन स्टाइल डिज़ाइन विकल्पों को बनाकर कुछ धार्मिक धार्मिक लड़ाइयों को बेरहमी से काट दिया, और मुझे लगता है कि जो मैंने देखा है, उसके लिए भाषा बेहतर है।


2
आपकी दूसरी गोली सही नहीं है। C ++ में, एक रेफरेंस / पॉइंटर, wrt घोषित करने के तीन / चार तरीके हैं। constness: mutable int *pointer to mutable value, mutable int const *pointer to const value, int * constकॉन्स्ट पॉइंटर टू म्यूटेबल वैल्यू, int const * constकॉन्स्ट पॉइंटर टू कॉन्स्ट वैल्यू।
phresnel

धन्यवाद। मैंने प्रकृति के बारे में पूछा, न कि विपणन ("उद्योग दूर जाना" C ++ की प्रकृति नहीं है - जैसे const), इस तरह के "कारणों" को मैं अप्रासंगिक मानता हूं (इस प्रश्न के लिए कम से कम)। constविषाक्तता के बारे में - क्या आप उदाहरण दे सकते हैं? क्योंकि AFAIK यह फायदा है, आप कुछ पास करते हैं constऔर यह बना रहना चाहिए const
ग्रीनल्डमैन

1
यह constसमस्या नहीं है, लेकिन वास्तव में प्रकार बदलना - आप जो भी करते हैं, वह हमेशा एक समस्या होगी। पास होने पर विचार करें RichString, और फिर आपको बेहतर पास का एहसास कराएं String
ग्रीनल्डमैन 7

4
@ रॉबी: मुझे यकीन नहीं है कि आप बाद वाले और पूर्व के साथ क्या / किसे संबोधित कर रहे हैं । हालाँकि: उस दोपहर के बाद कोड के माध्यम से चलने के बाद, आपको यह सीखना चाहिए कि आपको रि-कांस्टेबिलिटी को बॉटम-अप करने के लिए रिफ़ेक्टर करना चाहिए, न कि टॉप-डाउन यानी, सबसे अंतर यूनिट्स में शुरू करने के लिए, और अपने तरीके से काम करना चाहिए। हो सकता है कि आपकी इकाइयाँ भी पर्याप्त रूप से अलग-थलग न हों, इसके बजाय कसकर युग्मित होने के कारण, या आप आंतरिक प्रणालियों के शिकार हो गए हैं।
8

7
"कॉन्स्ट पॉइज़निंग" वास्तव में कोई समस्या नहीं है - वास्तविक समस्या यह है कि C ++ गैर को डिफॉल्ट करता है const। यह constउन चीजों को नहीं करना बहुत आसान है जिन्हें होना चाहिए constक्योंकि आपको इसे बाहर करने के बजाय इसे चुनना है।
डोभाल

0

constकिसी भाषा को जोड़ने में कुछ दार्शनिक समस्याएं हैं। यदि आप constएक वर्ग की घोषणा करते हैं , तो इसका मतलब है कि वर्ग बदल नहीं सकता है। लेकिन एक वर्ग विधियों (या म्यूटेटर) के साथ युग्मित चर का एक सेट है। हम तरीकों के एक सेट के पीछे एक वर्ग की स्थिति को छिपाकर अमूर्तता प्राप्त करते हैं। यदि एक वर्ग राज्य को छिपाने के लिए डिज़ाइन किया गया है, तो आपको उस राज्य को बाहर से बदलने के लिए म्यूटेटर की आवश्यकता होती है और फिर यह constअब नहीं है। इसलिए केवल constउन वर्गों को घोषित करना संभव है जो अपरिवर्तनीय हैं। तो constकेवल उन परिदृश्यों में संभव प्रतीत होता है जहाँ कक्षाएं (या आपके द्वारा घोषित किए जाने वाले प्रकार const) तुच्छ हैं ...

तो क्या हमें constवैसे भी ज़रूरत है? मुझे ऐसा नहीं लगता। मुझे लगता है कि आप आसानी से कर सकते हैं constयदि आपके पास एक अच्छा डिज़ाइन है। आपको कौन से डेटा की आवश्यकता है और कहां, कौन से तरीके डेटा-टू-डेटा तरीके हैं और आपको I / O, नेटवर्क, व्यू आदि के लिए किन एब्सट्रैक्ट्स की आवश्यकता है, फिर आप स्वाभाविक रूप से विभाजित मॉड्यूल और कक्षाएं पैदा करते हैं जो राज्य के साथ सौदा करते हैं और आपके पास तरीके हैं और अपरिवर्तनीय कक्षाएं जिन्हें राज्य की आवश्यकता नहीं है।

मुझे लगता है कि ज्यादातर समस्याएं बड़े वसा वाले डेटा-ऑब्जेक्ट्स के साथ उत्पन्न होती हैं, जो सहेज सकते हैं, बदल सकते हैं और खुद को आकर्षित कर सकते हैं और फिर आप उदाहरण के लिए इसे रेंडरर को पास करना चाहते हैं। इसलिए आप डेटा की सामग्री को कॉपी नहीं कर सकते, क्योंकि यह एक बड़ी डेटा-ऑब्जेक्ट के लिए बहुत महंगा है। लेकिन आप नहीं चाहते कि यह या तो बदले, इसलिए आपको कुछ ऐसा चाहिए, जैसा constआप सोचते हैं। संकलक को आपके डिज़ाइन दोषों का पता लगाने दें। हालाँकि यदि आप उन वस्तुओं को केवल एक अपरिवर्तनीय डेटा-ऑब्जेक्ट में विभाजित करते हैं और जिम्मेदार मॉड्यूल में विधियों को लागू करते हैं, तो आप सूचक (केवल) को पास कर सकते हैं और वे चीजें कर सकते हैं जो आप डेटा के साथ करना चाहते हैं जबकि अपरिवर्तनीयता की गारंटी भी देते हैं।

मुझे पता है कि सी ++ में कुछ तरीकों की घोषणा करना constऔर अन्य तरीकों पर घोषणा नहीं करना संभव है , क्योंकि वे उत्परिवर्ती हैं। और फिर कुछ समय बाद आपको कैश की आवश्यकता होती है और फिर एक गटर किसी वस्तु को उत्परिवर्तित करता है (क्योंकि यह आलसी लोड होता है) और यह constअब और नहीं है। लेकिन इस अमूर्तता की पूरी बात सही थी? आप नहीं जानते कि किस राज्य में प्रत्येक कॉल के साथ उत्परिवर्तन होता है।


1
"तो कॉन्स्ट केवल उन परिदृश्यों में संभव होते हैं जहां कक्षाएं (या प्रकार जिन्हें आप कॉन्स्टेबल घोषित करना चाहते हैं) तुच्छ हैं ..." लगातार डेटा संरचनाएं अपरिवर्तनीय और गैर-तुच्छ हैं। आप बस उन्हें C ++ में नहीं देखेंगे क्योंकि उनमें से सभी कई उदाहरणों के बीच अपने आंतरिक डेटा को साझा करते हैं, और C ++ में उस कार्य को करने के लिए कचरा संग्रह का अभाव है। "मुझे लगता है कि यदि आप एक अच्छा डिज़ाइन रखते हैं, तो आप आसानी से बिना कास्ट के कर सकते हैं।" अपरिवर्तनीय मूल्य कोड को बहुत आसान बनाते हैं।
डोभाल

+1 धन्यवाद। क्या आप कृपया "एक वर्ग के लिए प्रस्ताव घोषित करें" पर स्पष्ट कर सकते हैं? क्या आप का मतलब है कि एक वर्ग के रूप में कक्षा स्थापित करना? यदि हां, मैं इस बारे में नहीं पूछ रहा हूं - सी ++ कॉन्स्टेंट एक दृश्य की तरह काम करता है, तो आप ऑब्जेक्ट के बगल में एक कास्ट की घोषणा कर सकते हैं, न कि क्लास (या सी ++ 11 में कुछ बदला हुआ)। इसके अलावा अगले पैराग्राफ और शब्द "आसानी से" के साथ एक समस्या है - सी ++ के बारे में एक अच्छा सवाल है - सी # में कास्ट और इसमें शामिल काम की मात्रा सर्वोपरि है - हर प्रकार के लिए जिसे आप डालने के लिए चाहते हैं const(सी ++ अर्थ में) ) आपको इंटरफ़ेस को सभी गुणों के लिए भी परिभाषित करना होगा।
ग्रीनल्डमैन

1
जब आप एक "वर्ग" के बारे में बात कर रहे हैं, तो आप वास्तव में "एक वर्ग का उदाहरण" का मतलब है, है ना? मुझे लगता है कि यह एक महत्वपूर्ण अंतर है।
12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.