मैं C ++ 11 क्यों सीखूंगा, C और C ++ ज्ञात है? [बन्द है]


28

मैं C और C ++ में एक प्रोग्रामर हूं, हालांकि मैं दोनों में से किसी भी भाषा में नहीं लिखता और दोनों का मिश्रण लिखता हूं। कभी-कभी कक्षाओं में कोड होना, संभवतः ऑपरेटर ओवरलोडिंग या टेम्पलेट्स और ओह एसटीएल के साथ इतना स्पष्ट रूप से एक बेहतर तरीका है। कभी-कभी एक साधारण सी फ़ंक्शन पॉइंटर का उपयोग बहुत अधिक पठनीय और स्पष्ट होता है। इसलिए मुझे दोनों भाषाओं में सुंदरता और व्यावहारिकता मिलती है। मैं "यदि आप उन्हें मिलाते हैं और C ++ कंपाइलर के साथ संकलित करते हैं, तो यह चर्चा में नहीं आना चाहता कि यह अब कोई C ++ नहीं है। मुझे लगता है कि हम सभी को समझते हैं कि उनका मिश्रण करने से मेरा क्या मतलब है।" इसके अलावा, मैं C vs C ++ के बारे में बात नहीं करना चाहता, यह सवाल C ++ 11 के बारे में है।

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

मुझे पता है कि भविष्य में, जब आप कहते हैं कि C ++ सभी लोग C ++ 11 मानेंगे। आजकल जब आप C कहते हैं, तो आप सबसे ज्यादा C99 से मतलब रखते हैं। यह मुझे C ++ 11 सीखने पर विचार करता है। आखिरकार, अगर मैं C ++ में कोड लिखना जारी रखना चाहता हूं, तो मुझे कुछ बिंदुओं पर उन विशेषताओं का उपयोग शुरू करने की आवश्यकता हो सकती है, क्योंकि मेरे सहयोगियों के पास है।

उदाहरण के लिए C को लें। इतने सालों के बाद भी, सी। कोड में अभी भी बहुत से लोग सीखने और लिखने वाले कोड क्यों हैं? क्योंकि भाषा अच्छी है। अच्छा साधन क्या है, यह एक अच्छी प्रोग्रामिंग भाषा बनाने के लिए कई नियमों का पालन करता है। तो शक्तिशाली होने के अलावा (जो आसान या कठिन है, लगभग सभी प्रोग्रामिंग भाषाएं हैं), सी नियमित है और कुछ अपवाद हैं, यदि कोई हो। C ++ 11 हालाँकि, मुझे ऐसा नहीं लगता। मुझे यकीन नहीं है कि C ++ 11 में पेश किए गए बदलाव भाषा को बेहतर बना रहे हैं।

तो सवाल यह है कि मैं C ++ 11 क्यों सीखूंगा?

learning  c++  c  c++11 

3
मैं समझता हूं कि इस फोरम में C ++ 11 रेंट नहीं होना चाहिए और मैं इस पर पूरी तरह सहमत हूं: प्रत्येक डेवलपर को प्रोग्रामिंग भाषाओं और टूल के बारे में अपने व्यक्तिगत स्वाद का अधिकार है। हालाँकि, मेरे लिए बहुत अधिक व्यावहारिक मुद्दा है: मैं एक C ++ डेवलपर हूं और मुझे C ++ 11 पसंद नहीं है, क्या मुझे C ++ 11 का उपयोग करने के लिए मजबूर किया जाएगा या बाजार से बाहर जाना होगा / दूसरी भाषा में स्विच करना होगा कुछ साल?
जियोर्जियो

वैसे मैंने इसके बारे में थोड़ा सोचा है, निश्चित रूप से डी-प्रोग्रामिंग भाषा या गो जैसी आधुनिक से अधिक खरोंच वाली भाषाएं हैं। ये आपकी समस्या के लिए उपयुक्त हो सकते हैं डोमेन, अधिक सुसंगत, आदि। हालांकि बाजार हिस्सेदारी .. उद्योग में कोई भी प्रमुख खिलाड़ी डी का समर्थन नहीं करता है और यहां तक ​​कि गो भी "प्रयोगों" में से एक है। इसलिए सी + के पीछे प्रेरणा +11 उपयोगी सुधार होना चाहिए जो आपको बेहतर पठनीय, सुरक्षित और तेज़ कोड के साथ-साथ व्यापक उद्योग समर्थन लिखने की अनुमति देता है।
नेल्स

@giorgio, पिछले दो वर्षों के दौरान, मैंने C ++ का उपयोग करना बंद कर दिया था, जितना मैंने पहले किया था (ज्यादातर यह समझने के कारण कि धार्मिक C ++ प्रशंसक कैसे हैं, इस प्रश्न के उत्तर पढ़ रहे हैं), लेकिन फिर भी मैंने C ++ लाइब्रेरी में काम किया, जो मैं स्वेच्छा से करता हूं के लिए C ++ 11 का उपयोग किया। मेरा अनुभव यह था: C ++ 11 C ++ के बहुत भद्दे कोनों को संबोधित करता है, और यह सराहनीय है और वास्तव में इस पर सुधार होता है। जिस तरह से यह अपने स्वयं के भद्दे कोनों (मूल unedited पोस्ट देखें) करता है। हालांकि, उन भद्दे कोनों से बाहर लगता है यदि आप चीजों को "सामान्य तरीके से करते हैं" (उदाहरण के लिए भविष्य के उपयोग के लिए एक लैम्ब्डा को स्टोर नहीं करते हैं)।

@ जियोर्जियो, मेरा क्या मतलब है, सी ++ 11 शुरुआत में खराब लग सकता है, वास्तव में सी ++ खुद भयानक लगता है, लेकिन अगर आप सी ++ के साथ ठीक हैं, तो आप शायद सी ++ 11 भी पसंद करेंगे। बस इसके भद्दे हिस्सों को छूने से बचें और आप वास्तव में इसका आनंद ले सकते हैं।

@anon: किसी भाषा के भद्दे हिस्सों से छुटकारा पाने का एक तरीका यह है कि अतीत के साथ कटौती की जाए और एक नई भाषा शुरू की जाए, जैसे Apple स्विफ्ट के साथ कर रहा है (केवल कई उदाहरणों में से एक का नाम लेने के लिए)। विरासत कोड के साथ अलग-अलग संकलन के माध्यम से किया जा सकता है। C ++ के साथ समस्या यह है कि यह अनिश्चित काल तक बढ़ जाता है, शायद इसलिए कि यह प्रशंसकों के एक समुदाय द्वारा समर्थित है जो धार्मिक रूप से मानते हैं कि C ++ एक सच्ची भाषा है। निचला रेखा: मैंने C ++ 03 को थोड़ा भद्दा पाया लेकिन यह काम कर गया, विशेष रूप से क्यूटी और बढ़ावा देने वाले पुस्तकालयों के लिए धन्यवाद। दूसरी ओर, मैं अपने हाथों को C ++ 11 से दूर रखूंगा।
जियोर्जियो

जवाबों:


24

आपको इसे सीखना चाहिए अगर आपको लगता है कि आपको नौकरी पाने के लिए भविष्य में इसे जानने की आवश्यकता होगी। यदि आप आश्वस्त हैं कि आप कार्यबल में C / C ++ [और जो कुछ भी आप जानते हैं] के रूप में विपणन योग्य रहेंगे, तो इसे न सीखें। यदि आपका बॉस आपको C ++ 11 का उपयोग करने के लिए कहता है, तो "नहीं, मैं ऐसा नहीं करता"। अगर वह आपको आग लगाता है, तो कहीं और काम करें। C ++ 11 जानें, जब आप समझ जाते हैं कि जल्द ही आप उन कौशलों के साथ संतोषजनक रोज़गार नहीं पा सकेंगे, जिन्हें आप वर्तमान में जानते हैं।

मेरे तर्क को स्पष्ट करना चाहता था: मैं C-C + 11 विरोधी नहीं हूं। केवल यह कहकर कि आप "मुझे एक्स क्यों सीखना चाहिए" के लिए ओपी के प्रश्न को सामान्य कर सकते हैं। मैंने कभी भी एमएल, स्कीम या हैस्केल नहीं सीखी क्योंकि मेरे पास C और C ++ वाली नौकरी है। मुझे यकीन है कि वे भाषाएँ किसी के लिए उपयोगी हैं, लेकिन वे अभी मेरे लिए फायदेमंद नहीं हैं। अगर किसी ने मुझे एमएल में प्रोग्राम करने के लिए अच्छे पैसे की पेशकश की है, तो मैं इसे सीखने की कोशिश कर सकता हूं।


3
यदि आप "C / C ++" डेवलपर हैं, और यदि आपका बॉस आपको C ++ 11 का उपयोग करने के लिए कहता है, तो क्या आपको अभी आगे नहीं बढ़ना चाहिए और इसे अपने शस्त्रागार में जोड़ना चाहिए? मैं इस बात से सहमत हूं कि आपको अपना सारा समय सिर्फ सीखने के लिए भाषा सीखने में नहीं बिताना चाहिए, लेकिन जब आपका बॉस कहता है, "यह सीखें", तो शायद आगे जाकर इसे सीखना अच्छा होगा। यह आपको अधिक विपणन योग्य बनाता है, जैसा कि आपके अगले आवेदन पर समझाने के विरोध में है कि आपको अपमान करने पर निकाल दिया गया था।
15zer

हास्केल ... अजीब बात है, क्योंकि C ++ में लंबोदर को धीरे-धीरे शामिल किया गया है। : P
rbaleksandar

85

यह आसान है। C ++ 11 कोड को नाटकीय रूप से आसान बनाता है, लिखने के लिए क्लीनर, और तेज।

nullptrपुराने पर एक बड़ा सुधार है 0। यह टाइप-सेफ है और जब-तब इसके विपरीत नहीं जाना चाहिए 0। यह एक अच्छी बात है जो nullptrएक में परिवर्तित नहीं होगी int। यह समझ में नहीं आता है कि यह सब होने के लिए। क्या आप जानते हैं कि जब उन्होंने विचार करने की कोशिश की तो C ++ समिति ने क्या पाया #define NULL nullptr? सामान की तरह char c = NULL;। कितना भयानक है? केवल एक कारण यहां अपवाद है क्योंकि boolएक अभिन्न प्रकार माना जाता है, जो काफी गलत है- लेकिन सी ++ में पहले भी था, और सी में। तथ्य यह nullptrहै कि परिवर्तित नहीं होता है , यह बहुत अच्छा है और आपको इसे पसंद करना चाहिए।

या फिर रेवेले रेफरेंस और वैरेडिक टेम्प्लेट के बारे में कैसे? अधिक तेज़, अधिक सामान्य कोड। वहीं कुल जीत है।

पुस्तकालय सुधार के बारे में कैसे? सामान की तरह function, unique_ptrऔर shared_ptrपहले की तुलना में बहुत बेहतर थे, यह तर्क देना असंभव है कि C ++ 03 तरीका बेहतर था।

#define adding_func(x, y) ((x)+(y))

दूर से समकक्ष भी नहीं। मैक्रों छह अरब कारणों से खराब हैं। मैं उन सभी को यहाँ उद्धृत नहीं करने जा रहा हूँ, लेकिन यह अच्छी तरह से ज्ञात है कि मैक्रोज़ को उन सभी उद्देश्यों के लिए बचा जाना चाहिए जिनसे उन्हें संभवतः बचा जा सकता है। तुम क्या करने जा रहे हो जब यह

#define add_twice(x) (x + x)

ओह रुको, मुझे आशा है कि आपने वेतन वृद्धि या कुछ नहीं किया था x। कौन सा टेम्पलेट फ़ंक्शन संस्करण पूरी तरह से प्रतिरक्षा है। मुझे यह भी उम्मीद है कि आप उदाहरण के लिए नामस्थान की सराहना नहीं करते हैं ।

फिर आप बाहरी चर का उपयोग करने के लिए अपरिभाषित व्यवहार की दुनिया के लिए अपने आप को खोलते हैं, जिनके स्कोप पहले से ही समाप्त हो चुके हैं।

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

उदाहरण के लिए C को लें। इतने सालों के बाद भी, सी। कोड में अभी भी बहुत से लोग सीखने और लिखने वाले कोड क्यों हैं?

बहुत से लोग हैं जो सुबह अपने दाँत ब्रश नहीं करते हैं। कई हत्यारे, और बलात्कारी, और वेश्याएं हैं। और राजनेता। जो लोग आत्महत्या करते हैं। क्या आप यह तर्क देंगे कि इन गतिविधियों को अच्छा या उपयोगी बनाता है? बिलकूल नही। यह एक तार्किक गिरावट है कि सिर्फ इसलिए कि किसी ने ऐसा किया है, इसलिए यह अच्छा या उपयोगी होना चाहिए।

C अभी भी तीन कारणों से लिखा जा रहा है: क्योंकि C ++ कार्यान्वित करने के लिए एक कुतिया है, उदाहरण के लिए एम्बेडेड या कर्नेल मोड पर; क्योंकि विरासत कोडबेस सी में लिखे गए हैं और उन्हें अपग्रेड करने के लिए बहुत अधिक लागत आएगी, हालांकि यहां तक ​​कि सी + + उत्कृष्ट सी इंटरॉप भी संदिग्ध है; और क्योंकि इसे लिखने वाले लोग प्रोग्राम करना नहीं जानते हैं। बस। C लिखने का कोई और कारण नहीं है।

यदि आप C या पुरानी शैली C ++ लेते हैं, तो आपको कई अपवाद नहीं मिलेंगे।

एक सरल उदाहरण के लिए दयनीय सी-शैली सरणियों के बारे में कैसे? उन लोगों की संख्या, जो अपने सिर में सीधे ऐरे और पॉइंटर्स प्राप्त नहीं कर सकते, अश्लील हैं। इस तथ्य का उल्लेख नहीं करना कि सी मानक पुस्तकालय अविश्वसनीय रूप से असुरक्षित है।

आपके मुख्य तर्क तार्किक पतन और गलतफहमी से भरे हैं।


7
> तथ्य यह है कि nullptr परिवर्तित नहीं होता है अच्छा है, यह बहुत अच्छा है और आपको इसे पसंद करना चाहिए। अपनी राय ठीक करें, लेकिन थोड़ी देर के लिए शांत हो जाएं कि किसी और को क्या प्यार करना चाहिए, कृपया ... अगला कदम C ++ वकीलों तालिबानीवाद है!
एमिलियो गरवाग्लिया

5
मुझे लगता है कि आपके उत्तर का बाद का हिस्सा अधिक है कि सी ++ को सी के लिए क्यों पसंद किया जाना चाहिए। यह सवाल से बाहर है। "सी लाइब्रेरी असुरक्षित हैं" - पृथ्वी पर यह सवाल का जवाब कैसे देता है? मेरा तात्पर्य यह है कि C ++ 11 ऑफ़र में नई सुविधाओं को सीखना चाहिए, लेकिन C और C ++ समान चीज़ों को करने के लिए नहीं हैं। यदि C ++ निम्न स्तर पर लागू करने के लिए एक कुतिया है, तो C #, Java, पायथन और व्हाट्सन हैं क्योंकि वे उस निम्न को चलाने के लिए अभिप्रेत नहीं थे । सिर्फ इसलिए कि C ++ देशी कोड के लिए संकलित करता है, इसका मतलब यह नहीं है कि आप OO और महत्वपूर्ण, कर्नेल स्तर कोड के लिए इससे जुड़े पृष्ठ का उपयोग कर सकते हैं।
यति सगड़े २१

11
@ शहबाज, स्पष्ट रूप से आपको प्रोग्रामिंग लैंग्वेज (जैसे, टाइप सिस्टम, लेक्सिकल स्कूपिंग आदि) के बारे में थोड़ा और जानने के लिए मिला है, आपकी सभी टिप्पणियाँ पूरी तरह से सिंक से बाहर हैं। इस पुस्तक से शुरू करें: amazon.com/Theories-Programming-Languages-John-Reynolds/dp/…
SK-logic

5
@yati: C ++ में समान मॉड्यूल प्रणाली है जैसा कि सी। सदस्य कार्य को सादे पुराने C फ़ंक्शन के रूप में कार्यान्वित किया जाता है। वर्चुअल फ़ंक्शन को DLL से लोडिंग फ़ंक्शन के रूप में लागू किया जाता है। उन लोगों के बारे में कोई पृष्ठ नहीं है। और हाँ, यह निश्चित रूप से लागू होता है। एक शुरुआत के लिए, आपका विश्वास है कि यूनिक्स सबसे अच्छा व्यक्तिपरक है। यह 5% बाजार हिस्सेदारी है अन्यथा सुझाव देता है। और दूसरी बात, भले ही मैंने यूनिक्स को बिना किसी अंत के स्वीकार किया हो, एक उदाहरण एक प्रवृत्ति स्थापित नहीं करेगा। आपके द्वारा उद्धृत अन्य उदाहरणों के बारे में भी यही बात सही है। क्या उदाहरण हैं? वे अर्थहीन हैं। C ++ सी के रूप में प्रक्रियाओं के लिए अनुकूल है।
डेडएमजी नोव

8
@yatisagade C ++ एक बहु-प्रतिमान भाषा है जो हर चीज के लिए वर्चुअल फ़ंक्शंस लागू नहीं करता है, और C ++ में मेरे प्रोग्राम समान हैं। इसके कुछ हिस्से ऑब्जेक्ट-ओरिएंटेड डिज़ाइन का उपयोग करते हैं, इसके कुछ भाग कार्यात्मक हैं, आदि, जो उस विशेष उप-समस्या को हल करता है। मैं ऑब्जेक्ट-ओरिएंटेड शैली को जोड़ने के लिए C ++ की सराहना करता हूं, और मैं कार्यात्मक प्रोग्रामिंग के लिए समर्थन के विस्तार के लिए C ++ 11 की सराहना करता हूं।
डेविड स्टोन

29

सी ++ 11 एक नई भाषा नहीं है; यह C ++ का केवल एक विस्तार / संशोधन है जिसे आप पहले से जानते हैं। C ++ 11 किसी भी अन्य प्रोग्रामिंग भाषा की तरह ही सुविधाओं से युक्त है। उनमें से बहुत से पहले से थे, उनमें से कुछ नए हैं। लेकिन आपका प्रश्न वास्तव में है, क्या मुझे भाषा की सभी विशेषताओं को सीखना चाहिए (इस मामले में C ++ 11), या केवल 90% के साथ खुद को परिचित करना चाहिए?

IMO भले ही आप सभी भाषा का उपयोग नहीं कर रहे हों, आपको कम से कम इस बात को पढ़ना चाहिए कि नई सुविधाएँ आपके लिए क्या करती हैं। उनमें से बहुत सारे को लाइब्रेरी / फ्रेमवर्क कोड (विशेष रूप से टेम्प्लेट) बनाने के लिए शुरू किया गया था, उदाहरण के लिए लिखना आसान है (उदाहरण के लिए, C ++ 11 परफेक्ट फ़ॉरवर्डिंग असंभव था), लेकिन अगर आपको पहले उन फ़ीचर की आवश्यकता नहीं थी, तो संभावना है कि आप जीत गए। 'टी ध्यान दें कि इन सुविधाओं को C ++ 11 में जोड़ा गया था।

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

लैम्ब्डा जैसी चीजें भी विदेशी लग सकती हैं, लेकिन वे एक नए निर्माण को पेश नहीं करती हैं। इसके बजाय वे वही बनाते हैं जो हमारे पास लिखने में इतनी आसानी से पहले हुआ करता था। पहले प्रत्येक लंबोदर फ़ंक्शन को एक अलग वर्ग होना चाहिए। अब यह सिर्फ {... कोड ...} है। इसे प्यार करना।

कुंजी इन सुविधाओं को नहीं देखती है और सोचती है कि सूची कितनी कठिन है। इसके बजाय, C ++ का उपयोग करें जैसा कि आप सामान्य रूप से करते हैं और जब आप कुछ परिदृश्य में आते हैं जहां ये नई C ++ 11 सुविधाएँ काम में आती हैं (90% से अधिक लोग उस बिंदु पर कभी नहीं आएंगे), तो आपको बहुत खुशी होगी कि विस्तार भाषा को किया गया था। अभी के लिए, मेरा सुझाव है कि आप भाषा के बारे में जानने के लिए पर्याप्त सीखें कि वहां क्या है, जरूरी नहीं कि यह सब कैसे उपयोग किया जाए।


7
@ शहबाज - मुझे लगता है कि आप अभी भी इस उद्देश्य को याद नहीं कर रहे हैं कि क्यों नमाज के कार्यों को जोड़ा गया। और "इनपुट के रूप में उन्हें लेने के बिना चर का उपयोग करना" को बंद करना कहा जाता है और कई अन्य उच्च-स्तरीय भाषाओं में उपलब्ध है। यदि आपने फ़ंक्शनल ऑब्जेक्ट्स के साथ C ++ 11 के साथ बहुत सारे टेम्प्लेट कोड लिखे हैं, तो आप खुली बांहों के साथ लैम्ब्डा कार्यों का स्वागत करेंगे। इसे इस तरह से सोचें ... जब कंपाइलर मशीन कोड उत्पन्न करता है, तो टेम्पलेट फ़ंक्शन या क्लास जैसी कोई चीज नहीं होती है। वे उस बिंदु से पहले ठोस वर्गों / कार्यों को बनाने के लिए सभी "त्वरित" हैं। लैंबडास एक ही चीज है जब यह राज्य में आता है ...
DXM

5
... functors। लोगों को एक टन कोड लिखने के बजाय, प्रत्येक प्रकार के फ़ंक्टर और आपके द्वारा बंद किए जाने वाले प्रत्येक क्लोजर तत्व के लिए, C ++ 11 आपको एक शॉर्टकट सिंटैक्स निर्दिष्ट करने की अनुमति देता है और यह एक पूरे आंतरिक फ़नकार वर्ग को ऑटो-इंस्टेंट करेगा जैसे यह टेम्पलेट्स को त्वरित करता है। फिर, ध्यान रखें कि इन विशेषताओं में से अधिकांश का उपयोग 98-स्तर के कोड-कोड में नहीं किया जाएगा, लेकिन उन्हें एसटीएल / बूस्ट जैसी लाइब्रेरी बनाने के लिए जोड़ा गया था जो कि अधिक शक्तिशाली और लागू / डीबग करने के लिए आसान है
डीएक्सएम

10
@ शहबाज: ठीक है, तुम लंबोदर के कार्यों या बंदों को नहीं समझते। यह उचित है। तथ्य यह है कि वे कई अलग-अलग भाषाओं में उपयोग किए जाते हैं, यह सुझाव देना चाहिए कि वे उपयोगी हैं, चाहे आप उन्हें समझें या नहीं, और यह कि आपको उन्हें बहुत आलोचना करने से पहले समझना चाहिए।
डेविड थॉर्नले

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

6
@ शहबाज, बंद और ग्लोबल्स के बीच बिल्कुल समानता नहीं है, आप बिंदु को पूरी तरह से याद कर रहे हैं। इसे पढ़ें: en.wikipedia.org/wiki/Lambda_calculus और अपने मस्तिष्क को उड़ाने के लिए: en.wikipedia.org/wiki/Combinatory_logic
SK-logic

18

क्या फंक्शन लिखना इतना कठिन है, कि आपको फंक्शन की सामग्री को कोड के साथ इनलाइन लिखना है, इसके अलावा कोई नाम नहीं देना है?

जब आप ऐसा करते हैं कि आप स्क्रॉल करते हैं, या एक नई स्रोत फ़ाइल खोलते हैं और वहां फ़ंक्शन की परिभाषा जोड़ते हैं। फिर आपको वापस जाना होगा और उस पर जारी रखना होगा जो आप काम कर रहे थे, जो आपको कुछ हद तक विचलित करता है।

इसके अलावा, जब अन्य लोग आपको पढ़ रहे हैं तो कोड लैम्बडा कुछ मामलों में अधिक स्व-दस्तावेजी हो सकता है, बजाय यह कहने के कि "ओह, यह कार्य क्या करता है?" और इसकी घोषणा पर कूदते हुए आप केवल यह देख सकते हैं कि यह अपनी जगह पर क्या कर रहा है।

मेमने के बारे में हर्ब सटर द्वारा एक अच्छी बात है, शायद वह आपको बेहतर समझा सके:

http://channel9.msdn.com/events/PDC/PDC10/FT13

ठीक है, आप इसे लैंबडा-फंक्शन बनाने के बजाय सिर्फ कोड क्यों नहीं लिखते हैं?

क्योंकि आप इसे तब नहीं कर सकते जब आप एसटीएल एल्गोरिदम का उपयोग कर रहे हों, या कोई भी फ़ंक्शन जो आप उपयोग कर रहे हैं जिसके लिए आपको एक फ़ंक्शन पास करना होगा।

#define add_func (x, y) ((x) + (y))

लैम्ब्डा के बजाय इस उपयोग को सही ठहराने का कोई तरीका नहीं है, आप अपने कोड को मैक्रोज़ से भर नहीं सकते। मैक्रोज़ और फ़ंक्शंस के अलग-अलग उद्देश्य हैं, और एक, सामान्य रूप से, दूसरे के लिए एक प्रतिस्थापन नहीं है।

template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs)
                -> decltype(lhs+rhs) {return lhs + rhs;}

मैं मानता हूं, यह बदसूरत है। हालाँकि मुझे अपने आप को यह कहते हुए याद है कि "मुझे इस अभिव्यक्ति के प्रकार का पता क्यों लगाना चाहिए, हालांकि कंपाइलर यह पता लगा सकता है?" बहुत सारे मामलों में। यह उन क्षणों के दौरान बहुत मदद कर सकता है।

सारांश में:

भले ही C ++ 11 की नई विशेषताएँ उनके सिंटैक्स में बदसूरत लगती हैं, मुझे लगता है कि एक व्यक्ति को थोड़े समय में उनकी आदत पड़ सकती है। हर नई भाषा का निर्माण पहली बार में सीखना मुश्किल है; कल्पना करें कि आपने पहली बार एक पूरी कक्षा को लिखना सीखा: हेडर फ़ाइल में घोषणा को डालना, अंत में अतिरिक्त अर्धविराम को नहीं भूलना, स्रोत फ़ाइल में परिभाषाएँ डालना, हेडर फ़ाइल सहित यह सुनिश्चित करना है कि इसे रोकने के लिए गार्ड है। कई समावेशन, सदस्य फ़ंक्शन घोषणाओं में गुंजाइश रिज़ॉल्यूशन ऑपरेटर को नहीं भूलना और इसी तरह ...

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


सेल्फ डॉक्यूमेंटिंग और कम स्क्रॉलिंग आदि के बारे में तर्क, मुझे यकीन है कि विपरीत तर्क जैसे "क्लटरिंग कोड", "एक्सेस एक्सेस" आदि का इस्तेमाल एक बार यह तर्क देने के लिए किया गया था कि क्लास के बाहर के कार्यों पर प्रतिबंध क्यों लगाया जाना चाहिए। मुझे लगता है कि लोगों को यह तय करने के लिए अधिक अनुभवी होने की जरूरत है कि कौन बेहतर है। मुझे लगता है कि यह एक असफल प्रयोग है या एक बुरा डिजाइन है। मैं इस प्रयोग में लैब चूहे नहीं होने के लिए अधिक आश्वस्त हूं।
शाहबाज़

सिंटैक्स बदसूरत दिखने के बारे में, उदाहरण के लिए इन दोनों को लें: bool is_alive;और bool thisSpecialObjectOfMineIsAlive;। दोनों ही ऐसा करते हैं, लेकिन दूसरा वास्तव में बदसूरत दिखता है। क्यूं कर? क्योंकि मैंने गलती से सोचा था कि अधिक जानकारी डालने से यह और अधिक स्पष्ट हो जाता है, लेकिन इसने इसके विपरीत किया है। यह यहाँ एक ही सौदा है, स्ट्रॉस्ट्रुप का मतलब हमें सुविधाएँ देने से अच्छा था, लेकिन उसने अभी इसे अच्छा नहीं बनाया। मेरे लिए यह एक बुरा डिज़ाइन दिखाता है।
शहबाज़

3
अच्छी लग रही! = अच्छी, और बुरी लग रही! = बुरी।
डेडएमजी नोव

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

8

वास्तव में ओपी के पास कुछ बिंदु हैं, अधिकांश उत्तरों के रूप में। लेकिन वे दृष्टि में "दूर" हैं। C ++ (C सबसेट सहित) का एक लंबा इतिहास रहा है, जहाँ समय-समय पर कई सुविधाएँ जोड़ी गई थीं, उनमें से कुछ का कमोबेश बार-बार और -थिर का उपयोग किया गया था और गलतियाँ- दूसरों और अन्य लोगों में पूर्णता।

कभी-कभी ऐसा होता है कि एक नई सुविधा शुरू करने के बाद, एक पुराने व्यक्ति की आवश्यकता होती है, या इसके साथ विरोधाभास महसूस करता है। एक "स्वच्छ" भाषा को आत्मनिर्भर होना चाहिए जैसा कि यह है, और अब आवश्यक सुविधाओं को हटाया नहीं जाना चाहिए।

लेकिन जोड़ने से कुछ भी नष्ट नहीं होता है। हटाना (या बदलना) मौजूदा कोड को तोड़ता है जो अभी भी उत्पादन में है, इसलिए आप जो भी सुविधा जोड़ते हैं, आपको ध्यान रखना होगा कि मौजूदा कोड को नहीं तोड़ना चाहिए (विशेष रूप से, इसे चुपचाप न तोड़ें , इसे अलग-अलग चीजों को करना है। )।

क्या आपको वह सब सीखना है? हाँ, क्योंकि सभी सुविधाएँ अच्छी या बुरी हैं, जल्दी या बाद में उपयोग की जाती हैं। क्या यह भाषा "गुणवत्ता" के लिए एक अच्छी बात है (यह मानते हुए कि इसके लिए एक उद्देश्य उपाय है) एक और कहानी है: पिछड़े संगतता को कब तक बनाए रखा जाना चाहिए? जब कोई 3 साल कहता है और कोई दूसरा 50 कहता है, तो उसका जवाब खोजना मुश्किल है।

C ++ को अधिक "नियमित" रखने का विकल्प है ... इसे अधिक बार तोड़ें, एक खरोंच पुनरारंभ के साथ। लेकिन यह अब कोई C ++ नहीं होगा।

वहाँ भी करने की कोशिश कर रहे हैं कि (डी के लिए सोचें, उदाहरण के लिए: C ++ (यहां तक ​​कि 11) के रूप में बहुत अधिक ऑर्थोगोनल वास्तव में है), लेकिन वे कितने लोकप्रिय हैं? गति होने में उनकी कठिनाई के कारणों पर कई मौजूदा कोड के साथ असंगति है जो अभी भी चलना है।

C ++ 11, मेरे लिए, स्पष्ट रूप से नई जरूरतों और पिछड़ी संगतता के बीच एक समझौता है। जिसके परिणामस्वरूप इसकी ऐनक और कार्यान्वयन का एक निश्चित "गड़बड़" था। जब तक उस "गड़बड़" की लागत असंगति की लागत से कम नहीं होती है ... आपको उस समझौते के साथ छोड़ना होगा।

यदि आप अब इसे बर्दाश्त नहीं कर सकते, ... एक और छोटी भाषा पर विचार करना बेहतर है। सी ++ बस उस अर्थ में सरलीकृत नहीं किया जा सकता है। इस उम्र में नहीं।


मैं भी सहमत हूं। और एक डेवलपर के रूप में मुझे यह बहुत परेशान करने वाली भाषा लगती है जो हर समय बदलती रहती है (जिसे मुझे बार-बार सीखना पड़ता है)। यदि आप एक नई भाषा विकसित करते हैं तो आपको एक नई शुरुआत करनी चाहिए और एक अलग नाम का उपयोग करना चाहिए। यदि आप इसे विरासत कोड के साथ सहयोग करना चाहते हैं, तो उसके लिए अलग संकलन है। इसलिए मैं वास्तव में फैशनेबल बन गई नवीनतम विशेषताओं को शामिल करके मौजूदा भाषा को बदलने की नीति को नहीं समझता हूं। जैसा कि किसी ने कहा: आगे विकास स्वचालित रूप से प्रगति नहीं करता है।
जियोर्जियो

"C ++ को इस अर्थ में सरल नहीं किया जा सकता है। इस उम्र में नहीं।": उसी रास्ते का अनुसरण करते हुए अन्य प्रोग्रामिंग भाषाएँ (जैसे C, Ada, ...) क्यों नहीं हैं? हो सकता है क्योंकि उनके पास अपने स्वयं के अनुप्रयोगों के आला हैं और वे सभी संभावित अनुप्रयोग क्षेत्रों के लिए उपकरण होने की उम्मीद नहीं करते हैं ।
जियोर्जियो

@ जियोर्जियो: हाँ ... आप शायद "व्यावहारिक" अर्थों में सही हैं। लेकिन सिद्धांत रूप में ... मुझे कुछ अच्छे दिन याद हैं, जहाँ पास्कल "शिक्षण संदर्भ भाषा" था और आद्या "सब कुछ प्रोग्रामिंग भाषा wababe" थी।
एमिलियो गरवाग्लिया

मैंने पास्कल में प्रोग्रामिंग भी सीखी। जहाँ तक मुझे पता है कि अडा कई संशोधनों से गुज़री, लेकिन भाषा का मूल डिज़ाइन अविकसित नहीं था। सी और पास्कल के साथ भी ऐसा ही है। यदि कोई वास्तव में नई भाषा विकसित करना चाहता है, तो उसे स्पष्ट कटौती करने और कुछ नया शुरू करने के लिए पर्याप्त बहादुर होना चाहिए, जैसे डी, जावा, सी #। वर्तमान पथ C ++ के साथ मेरी समस्या यह है कि यह (अनावश्यक रूप से) बहुत जटिल हो रहा है। चुंबन और YAGNI सिद्धांतों सॉफ्टवेयर डिजाइन करने के लिए लागू होते हैं, इसलिए वे भाषा डिजाइन भी प्रोग्रामिंग के लिए लागू नहीं करना चाहिए?
जियोर्जियो

@ जियोर्जियो: ओह ... वे लागू होते हैं ... जैसा आपने कहा था। यदि आपको लगता है कि C # या D ने "उबले हुए" C ++ (आपकी भावना की मेरी व्याख्या) से बेहतर विकल्प चुना, तो C ++ के बजाय उनका उपयोग करें। C ++ पर समय बढ़ने के साथ धीरे-धीरे मृत्यु हो जाएगी। अभी, मैं C ++ 11 को "उबला हुआ" C ++ 03 को एक नया मौका दे रहा हूं, और अभी भी शुरुआती बाधा को तोड़ने के लिए कुछ गायब है। अर्थशास्त्र और निगम के हितों की भी भूमिका होती है कि कैसे विकास को वित्तपोषित और प्रोत्साहित किया जाता है। आप सिद्धांत में सही हैं, लेकिन वास्तविक दुनिया अधिक जटिल है।
एमिलियो गारवागलिया

7

यहां तक ​​कि अगर आप नई C ++ 11 विशेषताओं को अनदेखा करने का निर्णय लेते हैं, तो भी आपको उनसे लाभ होगा क्योंकि C ++ मानक लाइब्रेरी उनका उपयोग करेगी। उदाहरण के लिए, C ++ 98 में एक प्रकार vector<string>का वैरिएबल संभावित रूप से एक प्रदर्शन आपदा था क्योंकि वेक्टर बढ़ने पर कॉपियों की संख्या की आवश्यकता होती है। सी ++ 11 मूव कंस्ट्रक्टर के साथ, यह एक गैर-मुद्दा है। वास्तव में, मेरी इच्छा है कि C ++ 11 हमारे लिए अधिक नई सुविधाएँ लाए, कम नहीं - विशेष रूप से स्टैंडर्ड लाइब्रेरी में।


6

इतने सालों के बाद भी, सी। कोड में अभी भी बहुत से लोग सीखने और लिखने वाले कोड क्यों हैं? क्योंकि भाषा अच्छी है।

सबसे पहले, इन दिनों अधिकांश छात्र जावा या .NET सीख रहे हैं, सी। दूसरा नहीं, लोग अभी भी सी का उपयोग न केवल भाषा के रूप में अपने फायदे के कारण कर रहे हैं, बल्कि मुख्य रूप से इसलिए क्योंकि सी में मौजूदा सॉफ़्टवेयर की एक बड़ी मात्रा लिखी गई है जिसकी आवश्यकता है बनाए रखा और बढ़ाया जा सकता है, और क्योंकि कई मामलों में (जैसे एम्बेडेड प्लेटफार्मों) एक सी संकलक सभी है। संयोग से, ये कुछ कारण हैं जिनके कारण लोग अभी भी COBOL लिखते हैं।

उद्योग में एक प्रोग्रामर के लिए एक ब्रांड-नई परियोजना पर काम करना शुरू करना बहुत दुर्लभ है, जो एक मौजूदा कोड बेस से बंधा नहीं है, और अकेले काम करना जारी रखता है। इसलिए, C ++ 11 सीखने का कारण यह है कि आपको अन्य लोगों द्वारा लिखे गए कोड से निपटने की संभावना है, जो नई सुविधाओं का उपयोग करता है। इसके अलावा, जो सुविधाएँ जोड़ी गईं, उन्हें एक कारण के लिए जोड़ा गया था। एक बार जब आप उन्हें सीख लेते हैं और उनका उपयोग करते हैं, तो आप उनकी सराहना करने आ सकते हैं।


आपने मेरा वाक्य अधूरा उद्धृत किया। जैसा मैंने बाद में वाक्य में कहा, goodइसका मतलब यह है कि यह एक अच्छी प्रोग्रामिंग भाषा डिजाइन के नियमों का पालन करता है। मुझे नहीं पता कि आप कहां अध्ययन करते हैं, लेकिन मुझे 4 या 5 देशों के बारे में पता है और वे सभी सी के साथ प्रोग्रामिंग सीखना शुरू करते हैं। जैसा मैंने कहा, सी के साथ, कोई अपवाद नहीं हैं (कुछ ऐसा जो जावा में विपरीत है, आप मुश्किल से देख सकते हैं। एक ऐसा निर्माण खोजें जिसमें कोई अपवाद न हो)।
शाहबाज

1
@ शहबाज: मैंने पूरा वाकया उद्धृत किया। आपने एक कारण संबंध बनाया, और मैंने कहा कि यह सबसे अधूरा है। शुक्र है, मैं और अध्ययन नहीं करता। :) मैंने काफी कुछ किया है। मैं अमेरिका में रहता हूं, और जब मैं कॉलेज गया था (15 साल पहले) सी प्रारंभिक भाषा थी। बहरहाल, आज ज्यादातर अमेरिकी स्कूलों जावा के साथ शुरू, और वहाँ नहीं कर रहे हैं कि कई युवा प्रोग्रामर जो सी पता
Dima

5
@ शहबाज: मैं वास्तव में अपवादों वाले भाषा नियमों के साथ समस्या नहीं देखता। हां, C ++ की तुलना में C बहुत सरल भाषा है। दूसरी ओर, C ++ सरल कोड लिखना आसान बनाता है। सरल कोड लिखने के लिए आपको अधिक भाषा विशेषताओं की आवश्यकता होती है। इससे भाषा अधिक जटिल हो जाती है। मैं, एक के लिए, कक्षाएं, संदर्भ, RAII, टेम्पलेट, कंस्ट्रक्टर, विध्वंसक, अपवाद और नाम स्थान जैसी चीजें पसंद करता हूं। लेकिन आपने कहा कि आपका प्रश्न C बनाम C ++ के बारे में नहीं था, इसलिए मैंने उत्तर में इसके बारे में नहीं लिखा।
दिमा

5
  • असेंबली बनाई गई क्योंकि लोगों को मशीन कोड लिखना पसंद नहीं था
  • C इसलिए बनाया गया क्योंकि लोगों को असेंबली लिखना पसंद नहीं था
  • C ++ इसलिए बनाया गया क्योंकि लोग C लिखना पसंद नहीं करते थे
  • C ++ 11 इसलिए बनाया गया क्योंकि लोग C ++ लिखना पसंद नहीं करते थे

आप अपने सी ++ कैरियर में एक बिंदु पर आने वाले हैं, जहां आप खुद से कहते हैं, "मुझे यकीन है कि फंक्शंस के फॉलोवर्स सरल थे," या "NULL a int?" और तब आप C ++ 11 को समझेंगे।


सभी भाषाओं को बनाया गया था क्योंकि कोई मौजूदा लोगों को पसंद नहीं करता था। यह उनमें से किसी को भी अच्छा नहीं बनाता है।
शाहबाज़

मैं नहीं कहता कि NULLएक होना चाहिए int। यह नहीं करना चाहिए जो मुझे उचित नहीं लगता है, वह उस भाषा में एक निर्माण का परिचय देना है जो इसे हल करता है, लेकिन अपवादों का परिचय देता है। उन्हें बेहतर तरीके से एक ही काम करने में सक्षम होना चाहिए था।
शहबाज़

2
"C ++ 11 इसलिए बनाया गया क्योंकि लोग C ++ लिखना पसंद नहीं करते थे": अगर उन्हें C ++ लिखना पसंद नहीं था, तो C ++ C ++ 11 का सबसेट क्यों है?
जियोर्जियो

1
यह होना चाहिए: C # और Java इसलिए बनाए गए क्योंकि लोग C ++ लिखना पसंद नहीं करते थे।
15

4

सीखना हमेशा फायदेमंद होता है। ज्ञान ही शक्ति है।

मूल रूप से यही उत्तर है। बाकी सब कुछ केवल इस बात का विवरण है कि आप इससे कैसे लाभान्वित हो सकते हैं और इसे जानकर आपके पास क्या शक्तियाँ हैं, और वे इतने अधिक हैं कि कोई भी ज्ञान अधूरा होगा।

एक उदाहरण आपका अपना प्रश्न है। आप इसे कम से कम कुछ सीखे बिना भी नहीं पूछ पाएंगे।

और जैसा कि मैंने टिप्पणी की - असली चिंता यह नहीं है कि सीखना क्यों है, बल्कि उपयोग क्यों करना है । और यह एक पूरी तरह से अलग सवाल है।


4

आपको C ++ 11 सीखना चाहिए क्योंकि जोड़े गए फीचर आपको बेहतर कोड लिखने की अनुमति देते हैं। कुछ लोगों ने NULL पॉइंटर्स और लैम्ब्डा के प्रकार की सुरक्षा का उल्लेख किया है, जो बहुत अच्छे हैं। लेकिन मैं इस बात पर ध्यान आकर्षित करना चाहता हूं कि मुझे क्या लगता है कि C ++ 11 में सबसे नाटकीय बदलाव है, विशेष रूप से बड़े उत्पादन वातावरण में: शब्दार्थ को स्थानांतरित करें।

C ++ 11 'चलती' और 'नकल' की अलग-अलग धारणाओं का समर्थन करता है। नियमित C ++ में, हमारे पास बस = ऑपरेटर है जो मूल रूप से इन दोनों को करता है। लेकिन वास्तव में, हम एक ऑपरेटर के साथ दो अलग-अलग विचार व्यक्त कर रहे हैं, जो खतरनाक है।

यह कहाँ उपयोगी है, इसका सबसे स्पष्ट उदाहरण नया अनूठे_प्रति है। इसमें पुराने auto_ptr और scoped_ptr की सभी बेहतरीन विशेषताएं हैं। मान लीजिए कि हम एक ऐसा पॉइंटर रखना चाहते हैं जो किसी ऑब्जेक्ट की ओर इशारा करने वाला एकमात्र पॉइंटर होने की गारंटी हो। हम a = b से कैसे निपटेंगे? ठीक है, इससे पहले, हम फंस गए थे, आप या तो इसे पूरी तरह से अस्वीकार कर सकते हैं (जैसा कि scoped_ptr), या हम कर सकते हैं कि auto_ptr क्या करता है जहां a = b b से स्वामित्व चुराता है। Auto_ptr का यह व्यवहार बहुत ही भ्रमित करने वाला है क्योंकि a = b वास्तव में b को बदलता है। unique_ptr इसे संभालता है: a = b की अनुमति नहीं है, लेकिन आपके पास स्वामित्व चोरी करने के लिए a = std :: move (b) है। यह कैसे उपयोगी है? जहां, स्वैप का एक अलग (अतिभारित) संस्करण है जो कॉपी शब्दार्थों के बजाय चाल शब्दार्थों का उपयोग करता है। इसका मतलब यह है कि unique_ptr को स्वैप किया जा सकता है, कोई समस्या नहीं। इसका अर्थ है कि auto_ptr के विपरीत, unique_ptr एक कंटेनर में उपयोग करने के लिए सुरक्षित है और फिर सॉर्ट करें। unique_ptr मूल रूप से सभी है और सभी सुरक्षित मेमोरी प्रबंधन को समाप्त करते हैं जब आपको एक ही ऑब्जेक्ट पर कई पॉइंटर्स की आवश्यकता नहीं होती है।

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

मूवमेंट शब्दार्थ से कोड लिखना बहुत आसान हो जाता है जो लीक नहीं होगा और थ्रेड सुरक्षित है।


और यह भी, वैसे, कुशल।
निर फ्राइडमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.