यह देखते हुए कि C ++ '11 को मंजूरी दे दी गई थी, क्या यह परिवर्तित होता है कि कैसे एक C ++ शुरुआती भाषा सीखता है? [बन्द है]


21

मैं थोड़ी देर के लिए सी ++ सीखना चाहता हूं और हाई स्कूल में एपी कंप्यूटर प्रोग्रामिंग ले गया (जब यह सी ++ था और जावा नहीं)। मैं C का आनंद लेता हूं और अभी C ++ सीखने का समय नहीं मिला है या मैं C # पर वापस आऊंगा जहां मैं बहुत अधिक उत्पादक हूं।

मेरा सवाल यह है: यह देखते हुए कि C ++ '11 को मंजूरी दे दी गई है (हालांकि मुझे पूरी तरह से लागू नहीं पता है) क्या यह उस तरीके को बदल देता है जिसे मुझे सीखना चाहिए + ++? मैं C ++ का मालिक हूं : हर्ब स्किल्ट द्वारा पूर्ण संदर्भ जो कि 1998 से है। क्या नई स्वीकृत मानक ऐसी किताबों से कुछ नए ट्यूटोरियल / किताबों की तुलना में कम महत्वपूर्ण है जो मानक से चीजों को शामिल करते हैं? क्या पुरानी किताबों से सीखने से कोई फायदा है?


9
ऊफ। Schildt। मैं उसकी C ++ सामग्री की गुणवत्ता के बारे में बात नहीं कर सकता, लेकिन उसकी C सामग्री लंबे समय से उप-मानक थी (यहां तक ​​कि C का नवीनतम संस्करण: TCR में अभी भी कुछ गैर-तुच्छ त्रुटियाँ हैं)। मैं एक अलग लेखक द्वारा अधिक वर्तमान काम की तलाश करने की सलाह दूंगा।
जॉन बोडे

C ++ 11 ने C ++ की मूल बातें नहीं बदलीं, जो कि नवीनतम संशोधन में पेश किए गए कुछ भी करने के लिए सीखा जाना चाहिए और C ++ के पिछले संस्करण में मौजूद नहीं है।
रामहुंड

11
हर्ब शिल्ड्ट की किताब पर कभी भरोसा न करें। वास्तव में, जबकि C ++ की अधिकांश पुस्तकें खराब पुस्तकें हैं (और मैं यहाँ शैलीगत मुद्दों की बात नहीं कर रहा हूँ, लेकिन तथ्यात्मक तथ्यात्मक त्रुटियाँ हैं और प्रोग्रामिंग शैलियों को बढ़ावा देने के लिए जो कि छोटी-मोटी कोड को जन्म देती हैं), Schildt की किताबें बहुत ही ख़राब हैं। उसका नाम कुछ हद तक एक मेम बन गया।
sbi

4
@ रामदूत: मैं असहमत हूं। अगर यह सच था, तो हम अभी भी पहले मैनुअल संसाधन प्रबंधन सीखते हैं, और उसके बाद ही गतिशील संसाधन करने के तरीके सुरक्षित करते हैं। शुक्र है, यह (धीरे-धीरे) बदल रहा है। नई संभावनाएं, भले ही वे पुस्तकालय में "केवल" हों, नए मुहावरों के लिए कॉल करें। यदि आप एक भाषा से शुरू करते हैं, तो पहले पुराने मुहावरे क्यों सीखें, बाद में उन्हें अनलॉर्ब करना होगा?
sbi

जवाबों:


16

पूर्ण रूप से। इन दिनों तीन चीजें जो आमतौर पर पाठ 2 में होती हैं, उन्हें बहुत बाद में आगे बढ़ना चाहिए:

  • तार के सरणियों के रूप में स्ट्रिंग्स *, स्ट्रलेन, स्ट्रैन्क्सक्स तरीके, और इसी तरह
  • सामान्य और सूचक अंकगणित में सरणियाँ
  • आप जो नया करते हैं, उसे हटाएं [] जो आप नया [], और यहां तक ​​कि विनाशकारी भी हटाएं

आमतौर पर सबक 99 में होने वाली इन चीजों को बहुत आगे बढ़ना चाहिए

  • उपयोग करने के लिए चीजों के रूप में टेम्पलेट (लिखना, इतना नहीं)
  • std :: स्ट्रिंग
  • std :: shared_ptr <>
  • std :: वेक्टर <>, पुनरावृत्तियाँ, अन्य संग्रह

Evey कच्चे पॉइंटर को तुरंत एक स्मार्ट पॉइंटर रैपर को दिया जाना चाहिए (मैं साझा के साथ शुरू करूँगा, और बाद में विशिष्ट विचार करूँगा क्योंकि इसमें std :: Move और rvalue सन्दर्भों की व्याख्या करने की आवश्यकता है)। ऐसा करने से C ++ को जावा या C # सीखने में बहुत कुछ महसूस होगा, जहाँ आप भाषा के रूप में एक ही समय में लाइब्रेरी सीखते हैं। यह बहुत सारे मेमोरी के काम को भी दूर ले जाएगा, और लोगों को गोच के बारे में कम चिंतित छोड़ देगा।

मैं पहली बार हम एक संग्रह के माध्यम से पुनरावृति करना चाहते थे और प्रत्येक तत्व के लिए कुछ करना चाहते थे।

डिस्क्लेमर: मैं अभी Pluralsight के लिए C ++ कोर्स लिख रहा हूं और इस दृष्टिकोण का उपयोग कर रहा हूं। अंतिम मॉड्यूल "अन्य लोगों के कोड को समझना" है और यही वह जगह है जहां मैं भ्रामक सामान जैसे चार * तार, मैनुअल मेमोरी मैनेजमेंट, पॉइंटर अंकगणित, और इसी तरह से डालूंगा।

अपडेट: कुछ लोगों ने पूछा है कि C ++ 0x का अस्तित्व उन चीजों को सिखाने की प्रेरणा क्यों देता है जो C ++ 03 के साथ सिखाई जा सकती थीं। मुझे लगता है कि यह कई चीजें हैं:

  • वास्तव में स्मार्ट पॉइंटर्स, जो कि संग्रह के अनुकूल हैं, "एंप्लॉयी पॉइंट ऑफ़ एंप्लॉई पॉइंटर्स" जैसी चीजों की आवश्यकता को दूर करते हैं, जो हमें हमेशा नए / हटाने, पॉइंटर अंकगणित आदि पर वापस लाने के लिए प्रेरित कर रहे थे।
  • ऑटो इट्रेटर घोषणाओं के दर्द को दूर करता है
  • lambdas एक साधारण व्यक्ति के लिए कुछ करना चाहता है
  • यहां तक ​​कि तुच्छ के रूप में कुछ भी >>सही ढंग से पार्सिंग के रूप में समाप्त हो जाता है, जो कि कुछ टेम्प्लेट की घोषणा करते समय होने वाले गोच को समाप्त करता है
  • और इसी तरह

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


3
आपको ऐसा क्यों लगता है कि मैनुअल मेमोरी मैनेजमेंट को बाद में सिखाया जाना चाहिए? मुझे लगता है कि यह जानना महत्वपूर्ण है और यह स्मार्ट पॉइंटर्स सीखने पर अधिक सराहना करता है। मुझे C में मेमोरी मैनेजमेंट (और char arrays) सीखना है और इसने मुझे RAII और std :: string की सराहना की है, जितना मुझे लगता है कि अगर मुझे ऐसा करने की जरूरत नहीं होती तो मैं इसे और अधिक कर सकता हूँ।
जेटी

1
आपके उदाहरण ज्यादातर C ++ 98 बनाम पूर्व-मानक C ++ पर लागू होते हैं, C ++ 03 बनाम C ++ 11 पर नहीं। मुझे लगता है कि लैम्ब्डा दिया जाता है, std::for_each()यह जितना उपयोग किया जाता है, उससे कहीं अधिक लोकप्रिय autoहोगा , बहुत महत्वपूर्ण होगा, और नए फ़ंक्शन घोषणा सिंटैक्स (साथ में decltype) टेम्पलेट कोड में काफी उपयोग हो जाएगा। वे चीजें हैं जो वर्तमान C ++ पुस्तक नहीं सिखाती हैं। लेकिन, हां, सामान्य तौर पर मैं आपसे सहमत हूं ( +1)। जब मैंने C ++ पाठ्यक्रम देना शुरू किया, तो मैंने त्वरित C ​​++ के साथ शुरुआत की , और भले ही मेरा पाठ्यक्रम इससे अधिक से अधिक विचलन करने लगे, यह अभी भी अंतर्निहित सिद्धांत के लिए सही है।
sbi

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

1
@ एसबीआई: मुझे वहां आपके साथ सहमत होना होगा- इनमें से अधिकांश उदाहरण 2006 से आधुनिक सी ++ 101 की तरह प्रतीत होते हैं, सी ++ 11 के बारे में कुछ भी नया नहीं है।
डेडएमजी

2
@ जेटी: सी ++ में महारत हासिल करने की दिशा में सबसे महत्वपूर्ण कदम उन सभी तरीकों को सीख रहा है जिनसे आप मैनुअल मेमोरी मैनेजमेंट से बच सकते हैं । यह पूरी तरह से कुछ है जिसे "बाद में" सिखाया जाना चाहिए, एक बार आपने सीखा है कि आप "स्वचालित" मेमोरी प्रबंधन से कितनी दूर जा सकते हैं।
जल्पफ

9

बहुत, हाँ। साधारण तथ्य यह है कि C ++ 98 और 03 में, कई अच्छे अभ्यास मौलिक रूप से अनुपयोगी थे क्योंकि कार्यात्मक प्रोग्रामिंग के लिए भाषा की गुणवत्ता खराब है। अब जब लैम्ब्डा मौजूद है और काम करते हैं, तो लोग कार्यात्मक इंटरफेस को बहुत बेहतर स्वीकार करते हैं जो वे इस्तेमाल करते थे और जेनेरिक प्रोग्रामिंग पहले से भी अधिक मजबूत है।

1998 में, लोग केवल C ++ का उपयोग करके उच्च गुणवत्ता, सुरक्षित, तेज़ कोड लिखने की खोज शुरू कर रहे थे और बहुत सारे कोड "C क्लासेस" थे। C ++ 11 में, यह बहुत अलग है- कॉपी और स्वैप जैसे मुहावरे और तीन का नियम (अब पांच) अच्छी तरह से जाना और परिभाषित किया गया है, और बहुत अधिक संसाधन प्रबंधन प्रकार मानक बन गए हैं, जैसे shared_ptrऔर unique_ptrजहां पिछले मानक बस उन्हें छोड़ देते हैं छेद छेद के रूप में।

आप इस प्रश्न को C ++ की संदर्भ सामग्री की उत्कृष्ट सूची के लिए देख सकते हैं ।


1
वास्तव में मैं 1998 से कुछ साल पहले "सी विद क्लासेस" के अंत की शुरुआत करूंगा, लेकिन सामान्य तौर पर आप निश्चित रूप से सही हैं, और मैं आधा दशक से अधिक नहीं होगा। +1मुझ से।
एसबीआई

4

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

हालांकि 1998 से पुरानी एक पुस्तक सी ++ प्रोग्रामिंग शैली में कुछ अपडेट और विकास को याद कर सकती है, जो कि वर्षों से समुदाय में जमा है। मैं संसाधनों की थोड़ी अधिक जानकारी के लिए देखूंगा। पर्याप्त से अधिक मुफ्त ऑनलाइन ट्यूटोरियल और दस्तावेज़ हैं जो आपको एक अच्छी शुरुआत प्रदान करनी चाहिए। उनमें से कुछ C ++ 0x का भी उल्लेख कर सकते हैं।

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

हो सकता है कि बदलावों की एक सूची पर नज़र डालें । कम से कम कुछ अवधारणाएं जैसे कि छोरों के लिए आधारित सीमाएं शुरुआती लोगों के लिए भी नए ट्यूटोरियल में दिखाई देंगी। तो यह देखने लायक है।


धन्यवाद! क्या आपको ऑनलाइन या पुस्तकों के किसी भी सभ्य संसाधनों का पता है?
जेटी

2
नहीं, cplusplus साइट को अक्सर एक संसाधन के रूप में उल्लेख किया जाता है, जिसे कभी भी किसी को भी नहीं भेजा जाना चाहिए, जिसे आप वास्तव में अच्छा कोड लिखना चाहते हैं।
डेडएमजी

@DeadMG क्या आपके पास कोई वैकल्पिक वेबसाइट है?
TheLQ

@ THELQ: आप MSDN संदर्भ के साथ आगे प्राप्त करेंगे, या cprogramming.com
डेडएमजी

@ जेटी: C ++ को सिखाने के लिए C ++ 11 का उपयोग करने के लिए मुझे किसी भी सामग्री की जानकारी नहीं है। मैंने जो कुछ भी देखा है वह C ++ 03 के शीर्ष पर C ++ 11 सिखाता है। बाद के सीखने के लिए stackoverflow.com/questions/388242/… देखें ।
sbi

3

बेशक, संबंधित किसी भी तकनीक के संबंध में, नवीनतम सामग्री के साथ अद्यतित रहना हमेशा एक स्मार्ट कदम होता है, हालांकि, C ++ 11 में शुरू किए गए परिवर्तनों को नाव को रॉक नहीं करने के लिए डिज़ाइन किया गया है। यदि आप C ++ (या सामान्य रूप से प्रोग्रामिंग) के लिए नए हैं, तो यह ऐसा कुछ नहीं है जिसके बारे में मुझे चिंता होगी।

इसके अतिरिक्त, यदि आप एक पेशेवर प्रोग्रामर हैं, तो आप शर्त लगा सकते हैं कि आप भविष्य में किसी और के कोड पर काम कर रहे हैं, इसलिए चीजों के काम करने के तरीके को समझने में हमेशा महत्व होता है, भले ही यह व्यवहार में एक ह्रास तकनीक हो।


आपकी प्रतिक्रिया के लिए धन्यवाद, मुझे लगा कि यह पुराने संसाधन का उपयोग करते समय पुराने कोड को देखने में कम से कम मेरी मदद करेगा।
जेटी

लैम्ब्डा, autoऔर अतुल्यकालिक फ़ंक्शन निष्पादन कुछ भी कैसे कर सकता है लेकिन "रॉक द रॉक"?
एसबीआई

1
मेरा तर्क है कि नए उपकरणों की शुरुआत और डिज़ाइन दर्शन में एक व्यापक बदलाव के बीच एक अंतर है (जैसे कि हम PHP के साथ देख रहे हैं, उदाहरण के लिए
leo

1
@ एलो: मैं असहमत हूं। एसटीएल, स्मार्ट पॉइंटर्स और समृद्ध टेम्प्लेट सुविधाओं की शुरूआत ने सी ++ की मुख्यधारा के डिजाइन दर्शन को पूरी तरह से बदल दिया है। बस हर के बारे में बढ़ावा पुस्तकालय 90 के दशक के अपने औसत C ++ पुस्तकालय से पूरी तरह से अलग है।
एसबीआई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.