मुख्य बातें
1. C++: एक भाषा जो सुंदर और कुशल अमूर्तता के लिए है
C++ एक ऐसी भाषा है जो सुंदर और कुशल अमूर्तता विकसित करने और उपयोग करने के लिए बनाई गई है।
द्वैध स्वभाव। C++ को इस तरह डिज़ाइन किया गया है कि यह निम्न-स्तरीय हार्डवेयर एक्सेस और उच्च-स्तरीय समस्या क्षेत्रों के बीच की खाई को पाट सके। यह C की सिस्टम प्रोग्रामिंग के लिए दक्षता को विरासत में पाता है, साथ ही Simula से प्रेरित शक्तिशाली अमूर्तन तंत्र जोड़ता है। इसका उद्देश्य ऐसी भाषा प्रदान करना है जो प्रदर्शन में तेज़ और अभिव्यक्ति में स्पष्ट हो, जिससे प्रोग्रामर सीधे कोड में अवधारणाओं को व्यक्त कर सकें।
- सीधे हार्डवेयर से जुड़ाव
- किफायती अमूर्तन तंत्र
- सामान्य प्रयोजन की भाषा
- सिस्टम प्रोग्रामिंग की ओर झुकाव
शून्य ओवरहेड। C++ के डिज़ाइन का एक मूल सिद्धांत है "शून्य-ओवरहेड सिद्धांत": आप केवल उन्हीं चीज़ों के लिए भुगतान करते हैं जिनका आप उपयोग करते हैं। भाषा की विशेषताएँ और मूलभूत अमूर्तताएँ हाथ से लिखे गए कोड जितनी कुशल होती हैं। यह प्रदर्शन-संवेदनशील अनुप्रयोगों और बुनियादी ढांचे के सॉफ़्टवेयर के लिए अत्यंत महत्वपूर्ण है।
- दक्षता सर्वोपरि
- अप्रयुक्त सुविधाओं के लिए कोई छुपा हुआ खर्च नहीं
- संसाधन-सीमित वातावरण में उपयोग संभव
विचारों की अभिव्यक्ति। यह भाषा प्रोग्रामरों को विचारों को स्पष्ट और सीधे कोड में व्यक्त करने में मदद करती है। इसमें अवधारणाओं को प्रकारों के रूप में, संबंधों को पदानुक्रम या पैरामीटराइजेशन के रूप में, और स्वतंत्र विचारों को स्वतंत्र रूप से व्यक्त करना शामिल है। विभिन्न प्रोग्रामिंग शैलियों के संयोजन को सर्वोत्तम समाधान पाने के लिए प्रोत्साहित किया जाता है।
- विचारों को सीधे व्यक्त करें
- संबंधों को दर्शाएं
- स्वतंत्र विचारों को अलग रखें
- सरल विचारों को सरलता से व्यक्त करें
2. आधुनिक C++ (C++11) एक बेहतर भाषा है
C++ अब एक नई भाषा जैसा महसूस होता है।
महत्वपूर्ण विकास। वर्षों में C++ भाषा में नाटकीय सुधार हुए हैं, विशेष रूप से C++11 मानक के साथ। इन परिवर्तनों ने C++ को एक अधिक शक्तिशाली और परिष्कृत उपकरण बना दिया है जो उच्च गुणवत्ता वाला सॉफ़्टवेयर लिखने में मदद करता है। आधुनिक C++ विचारों की अभिव्यक्ति को और अधिक स्पष्ट, सरल और सीधे बनाता है।
- C++11 बनाम C++98
- अभिव्यक्ति की बढ़ी हुई क्षमता
- बेहतर सुरक्षा और प्रदर्शन
मुख्य विशेषताएँ। C++11 ने कई नई विशेषताएँ पेश कीं, जिन्होंने C++ के लेखन और उपयोग के तरीके को मौलिक रूप से बदल दिया। इनमें समवर्ती प्रोग्रामिंग, संसाधन प्रबंधन, और सामान्य प्रोग्रामिंग के लिए बेहतर समर्थन शामिल है, साथ ही सिंटैक्स में सुधार जो कोड को संक्षिप्त बनाते हैं।
- समवर्ती समर्थन (
std::thread,std::mutex) - मूव सेमांटिक्स (
std::move, rvalue संदर्भ) - स्मार्ट पॉइंटर्स (
unique_ptr,shared_ptr) - लैम्ब्डा अभिव्यक्तियाँ
autoऔरconstexpr- इनिशियलाइज़र सूचियाँ
आधुनिक शैलियों को अपनाना। प्रोग्रामरों को प्रबल रूप से प्रोत्साहित किया जाता है कि वे आधुनिक C++ की विशेषताओं और शैलियों को अपनाएं। पुराने C++98 या C शैलियों पर टिके रहने से कम गुणवत्ता, कम रखरखाव योग्य और संभवतः कम प्रदर्शन वाला कोड बनेगा। मानक पिछड़ेपन के साथ संगतता सुनिश्चित करता है, लेकिन प्रगति आवश्यक है।
3. क्लासेस: अमूर्तन की नींव
C++ की केंद्रीय भाषा विशेषता क्लास है।
उपयोगकर्ता-परिभाषित प्रकार। क्लासेस उपयोगकर्ता-परिभाषित प्रकार बनाने का मुख्य माध्यम हैं, जो समस्या क्षेत्र की अवधारणाओं को सीधे कोड में दर्शाते हैं। अच्छी तरह से चुनी गई क्लासेस प्रोग्राम को समझने, तर्क करने और संशोधित करने में आसान बनाती हैं।
- अवधारणाओं को प्रकार के रूप में व्यक्त करें
- अमूर्तन तंत्र की नींव
- कोड की स्पष्टता और रखरखाव में सुधार
एन्कैप्सुलेशन। क्लासेस सार्वजनिक इंटरफ़ेस (जो उपयोगकर्ता देखते और उपयोग करते हैं) और निजी कार्यान्वयन विवरण (डेटा सदस्य और सहायक फ़ंक्शन) के बीच अंतर करने की अनुमति देती हैं। यह डेटा छुपाने को लागू करता है, डेटा के सुसंगत उपयोग की गारंटी देता है, और कार्यान्वयन को बदले बिना उपयोगकर्ता कोड को प्रभावित किए बिना परिवर्तन करने की सुविधा देता है।
- सार्वजनिक इंटरफ़ेस
- निजी कार्यान्वयन
- डेटा छुपाना
- जिम्मेदारियों का पृथक्करण
कंस्ट्रक्टर और डेस्ट्रक्टर। कंस्ट्रक्टर यह परिभाषित करते हैं कि ऑब्जेक्ट कैसे आरंभ होते हैं, यह सुनिश्चित करते हुए कि वे निर्माण के समय वैध स्थिति में हों। डेस्ट्रक्टर उन सफाई क्रियाओं को परिभाषित करते हैं जो ऑब्जेक्ट के नष्ट होने पर की जाती हैं, जो संसाधनों को मुक्त करने के लिए आवश्यक हैं। यह कंस्ट्रक्टर/डेस्ट्रक्टर जोड़ी RAII जैसी संसाधन प्रबंधन तकनीकों की आधारशिला है।
- गारंटीकृत आरंभिकरण
- संसाधन अधिग्रहण (कंस्ट्रक्टर)
- संसाधन विमोचन (डेस्ट्रक्टर)
- क्लास स्थिरताएँ
4. संसाधन प्रबंधन: RAII और स्मार्ट पॉइंटर्स
कंस्ट्रक्टर/डेस्ट्रक्टर संयोजन कई सुंदर तकनीकों की आधारशिला है।
RAII सिद्धांत। Resource Acquisition Is Initialization (RAII) एक मौलिक C++ तकनीक है जिसमें संसाधन अधिग्रहण ऑब्जेक्ट के आरंभिकरण (कंस्ट्रक्टर) से जुड़ा होता है और संसाधन विमोचन ऑब्जेक्ट के विनाश (डेस्ट्रक्टर) से। यह सुनिश्चित करता है कि संसाधन सही ढंग से प्रबंधित हों, भले ही अपवाद फेंके जाएं या फ़ंक्शन जल्दी समाप्त हो जाए।
- कंस्ट्रक्टर में संसाधन अधिग्रहण
- डेस्ट्रक्टर में संसाधन विमोचन
- स्कोप से बाहर निकलने पर स्वचालित सफाई
- अपवाद सुरक्षा
लीक से बचाव। RAII संसाधन लीक (जैसे मेमोरी लीक) और अन्य प्रबंधन त्रुटियों (अकालीन हटाना, दोहरी हटाना) को रोकने में मदद करता है। संसाधन स्वामित्व को ऑब्जेक्ट्स में संलग्न करके, कंपाइलर स्वचालित रूप से सफाई करता है।
- "नग्न"
newऔरdeleteसे बचाव - मेमोरी लीक रोकता है
- फ़ाइलें, लॉक, थ्रेड आदि संभालता है
स्मार्ट पॉइंटर्स। unique_ptr और shared_ptr मानक पुस्तकालय के स्मार्ट पॉइंटर्स हैं जो RAII का उपयोग करके डायनामिक मेमोरी का प्रबंधन करते हैं। unique_ptr विशेष स्वामित्व प्रदान करता है, जबकि shared_ptr संदर्भ गणना के माध्यम से साझा स्वामित्व। ये कच्चे पॉइंटर्स की तुलना में बेहतर विकल्प हैं।
unique_ptr(विशेष स्वामित्व)shared_ptr(साझा स्वामित्व)- स्वचालित मेमोरी विमोचन
- मैनुअल
deleteकॉल से बचाव
5. टेम्प्लेट्स: सामान्य प्रोग्रामिंग को सक्षम बनाना
टेम्प्लेट एक क्लास या फ़ंक्शन होता है जिसे हम प्रकारों या मानों के सेट के साथ पैरामीटराइज करते हैं।
कंपाइल-टाइम पैरामीटराइजेशन। टेम्प्लेट्स क्लासेस, फ़ंक्शंस, और प्रकार उपनामों को परिभाषित करने की अनुमति देते हैं जो प्रकारों, मानों, या अन्य टेम्प्लेट्स द्वारा पैरामीटराइज्ड होते हैं। इससे विभिन्न प्रकारों के साथ काम करने वाला कोड लिखा जा सकता है बिना प्रदर्शन खोए।
- प्रकार या मान द्वारा पैरामीटराइजेशन
- कंपाइल-टाइम बहुरूपता
- कोड जनरेशन
सामान्य प्रोग्रामिंग। टेम्प्लेट्स C++ में सामान्य प्रोग्रामिंग की नींव हैं, जो ऐसे एल्गोरिदम और डेटा संरचनाओं को डिजाइन करने पर केंद्रित हैं जो किसी भी प्रकार के साथ काम कर सकें जो विशिष्ट आवश्यकताओं (कॉन्सेप्ट्स) को पूरा करता हो। इससे पुन: प्रयोज्य, प्रकार-सुरक्षित और कुशल कोड लिखा जा सकता है।
- सामान्य एल्गोरिदम डिजाइन करें
- विभिन्न प्रकारों के साथ काम करें
- कॉन्सेप्ट्स (आर्गुमेंट्स की आवश्यकताएँ)
दक्षता। टेम्प्लेट्स एक कंपाइल-टाइम तंत्र हैं, जिसका अर्थ है कि इनके उपयोग से रन-टाइम ओवरहेड नहीं होता। यह इनलाइनिंग और कंपाइल-टाइम गणना जैसी तकनीकों के माध्यम से संभव होता है।
- शून्य रन-टाइम ओवरहेड
- इनलाइनिंग सक्षम करता है
- कंपाइल-टाइम गणना
6. स्टैंडर्ड लाइब्रेरी: आपका आवश्यक उपकरण
कोई भी महत्वपूर्ण प्रोग्राम केवल एक खाली प्रोग्रामिंग भाषा में नहीं लिखा जाता।
आवश्यक घटक। स्टैंडर्ड लाइब्रेरी एक व्यापक सेट प्रदान करती है जो लगभग हर C++ प्रोग्राम के लिए आवश्यक है। इनमें कंटेनर, एल्गोरिदम, I/O सुविधाएँ, उपयोगिताएँ, और समवर्ती समर्थन शामिल हैं।
- कंटेनर (vector, list, map, set)
- एल्गोरिदम (sort, find, copy, unique)
- I/O स्ट्रीम्स (cin, cout, cerr)
- उपयोगिताएँ (pair, tuple, स्मार्ट पॉइंटर्स, समय)
- समवर्ती समर्थन
नींव। स्टैंडर्ड लाइब्रेरी स्वयं C++ में लिखी गई है, जो भाषा की शक्ति को दर्शाती है और अच्छे डिज़ाइन का मॉडल है। यह अन्य लाइब्रेरी और अनुप्रयोगों के लिए सामान्य आधार के रूप में कार्य करती है, पोर्टेबिलिटी और इंटरऑपरेबिलिटी को बढ़ावा देती है।
- C++ में लिखी गई
- अच्छे डिज़ाइन का मॉडल
- पोर्टेबिलिटी को बढ़ावा
- इंटरऑपरेबिलिटी सक्षम
स्टैंडर्ड को प्राथमिकता दें। प्रोग्रामरों को प्रबल रूप से प्रोत्साहित किया जाता है कि वे स्टैंडर्ड लाइब्रेरी घटकों का उपयोग करें बजाय उन्हें फिर से बनाने के। स्टैंडर्ड घटक अच्छी तरह डिज़ाइन किए गए, अनुकूलित, व्यापक रूप से उपलब्ध और परिचित होते हैं, जिससे रखरखाव लागत कम होती है और कोड गुणवत्ता बेहतर होती है।
- पहिये को फिर से न बनाएं
- अच्छी तरह डिज़ाइन और अनुकूलित
- व्यापक रूप से उपलब्ध और परिचित
7. समवर्तीता: समानांतरता के लिए अंतर्निहित समर्थन
समवर्तीता – कई कार्यों का एक साथ निष्पादन – थ्रूपुट बढ़ाने (एकल गणना के लिए कई प्रोसेसर का उपयोग) या प्रतिक्रिया क्षमता सुधारने (जब एक भाग प्रतिक्रिया की प्रतीक्षा कर रहा हो तब दूसरा भाग प्रगति कर सके) के लिए व्यापक रूप से उपयोग की जाती है।
आधुनिक विशेषता। C++ में समवर्ती प्रोग्रामिंग के लिए मजबूत, पोर्टेबल और प्रकार-सुरक्षित समर्थन शामिल है, जो आधुनिक मल्टी-कोर हार्डवेयर की आवश्यकताओं को पूरा करता है। यह C++11 में एक महत्वपूर्ण जोड़ है।
- अंतर्निहित समर्थन
- पोर्टेबल और प्रकार-सुरक्षित
- मल्टी-कोर प्रोसेसर के लिए उपयुक्त
थ्रेड्स और टास्क। लाइब्रेरी निम्न-स्तरीय थ्रेड प्रबंधन (std::thread) और उच्च-स्तरीय टास्क-आधारित अमूर्तताएँ (std::future, std::async) प्रदान करती है। थ्रेड्स एक साझा पता स्थान साझा करते हैं, इसलिए डेटा रेस से बचने के लिए सावधानीपूर्वक समन्वय आवश्यक है।
- सिस्टम थ्रेड्स के लिए
std::thread - साझा पता स्थान
- टास्क-आधारित समवर्तीता (
std::async)
समन्वय। म्यूटेक्स (std::mutex) और कंडीशन वेरिएबल्स (std::condition_variable) जैसे तंत्र साझा डेटा एक्सेस को प्रबंधित करने और थ्रेड्स को समन्वयित करने के लिए प्रदान किए गए हैं। एटॉमिक ऑपरेशंस सरल प्रकारों के लिए सूक्ष्म, लॉक-फ्री समन्वय प्रदान करते हैं।
- म्यूटेक्स और लॉक
- कंडीशन वेरिएबल्स
- एटॉमिक ऑपरेशंस
- डेटा रेस से बचाव
8. प्रकारों और मूलभूत सुविधाओं में महारत
हर नाम और हर अभिव्यक्ति से जुड़ा होता है एक प्रकार।
मूलभूत निर्माण खंड। C++ के अंतर्निहित प्रकारों (int, double, char, bool), वेरिएबल घोषित करने के तरीके, स्कोप के नियम, और मूल नियंत्रण प्रवाह कथनों (if, switch, for, while) को समझना आधारभूत है। ये तत्व C से विरासत में मिले हैं और C++ में सुधारित हैं, जो सभी C++ प्रोग्रामों की नींव हैं।
- अंतर्निहित प्रकार
- घोषणाएँ और स्कोप
- नियंत्रण प्रवाह कथन
- अभिव्यक्तियाँ और ऑपरेटर
प्रकार सुरक्षा। C++ एक स्थैतिक रूप से टाइप की गई भाषा है, जिसका अर्थ है कि प्रकार कंपाइल समय पर जांचे जाते हैं। इससे त्रुटियाँ जल्दी पकड़ में आती हैं। auto प्रकार अनुमान और constexpr कंपाइल-टाइम स्थिरांक जैसी विशेषताएँ प्रकार सुरक्षा और अभिव्यक्ति को बढ़ाती हैं।
- स्थैतिक प्रकार जांच
- त्रुटियाँ जल्दी पकड़ें
autoप्रकार अनुमान के लिएconstexprकंपाइल-टाइम स्थिरांक के लिए
पॉइंटर्स और संदर्भ। C++ मेमोरी तक अप्रत्यक्ष पहुँच के लिए पॉइंटर्स और संदर्भ प्रदान करता है। ये शक्तिशाली हैं, लेकिन संसाधन स्वामित्व के प्रबंधन में सावधानी की आवश्यकता होती है। स्मार्ट पॉइंटर्स कच्चे पॉइंटर्स की तुलना में बेहतर विकल्प हैं।
- पॉइंटर्स और संदर्भ
- अप्रत्यक्ष मेमोरी पहुँच
- स्वामित्व के लिए स्मार्ट पॉइंटर्स
9. प्रभावी समाधानों के लिए प्रोग्रामिंग शैलियों का संयोजन
अधिकांश जटिल समस्याओं का सबसे अच्छा (सबसे रखरखाव योग्य, सबसे पठनीय, सबसे छोटा, सबसे तेज़ आदि) समाधान वह होता है जो इन शैलियों के पहलुओं को संयोजित करता है।
संश्लेषण, न कि विशिष्टता। C++ को कई प्रोग्रामिंग शैलियों का समर्थन करने के लिए डिज़ाइन किया गया है: प्रक्रियात्मक, डेटा अमूर्तन, वस्तु-उन्मुख, और सामान्य प्रोग्रामिंग। भाषा की विशेषताएँ इन शैलियों को संयोजन में उपयोग करने की अनुमति देती हैं, और सबसे प्रभावी समाधान अक्सर कई दृष्टिकोणों का मिश्रण होते हैं।
- प्रक्रियात्मक प्रोग्रामिंग
- डेटा अमूर्तन
- वस्तु-उन्मुख प्रोग्रामिंग
- सामान्य प्रोग्रामिंग
कट्टरता से बचें। केवल एक शैली पर ध्यान केंद्रित करना या C++ को "हाइब्रिड" भाषा के रूप में देखना इसकी संश्लेषण शक्ति को समझने में बाधा है। भाषा ऐसे उपकरण प्रदान करती है जिन्हें संयोजन में सुंदरता से उपयोग किया जा सकता है।
- भाषा संयोजनों का समर्थन करती है
- एकल दृष्टिकोण से बचें
व्यावहारिक डिज़ाइन। प्रभावी C++ प्रोग्रामिंग में उपलब्ध उपकरणों (भाषा विशेषताएँ, स्टैंडर्ड लाइब्रेरी घटक) में से सही चुनना और उन्हें समस्या के अनुसार संयोजित करना शामिल है। इसके लिए विभिन्न दृष्टिकोणों की ताकत और कमजोरियों को समझना आवश्यक है।
- सही उपकरण चुनें
- विशेषताओं को प्रभावी ढंग से संयोजित करें
- डिज़ाइन और तकनीकों पर ध्यान दें
10. त्रुटि प्रबंधन: अपवाद और गारंटियाँ
अपवाद की अवधारणा त्रुटि का पता चलने के बिंदु से उसे संभालने के बिंदु तक जानकारी पहुँचाने में मदद करती है।
जिम्मेदारियों का पृथक्करण। अपवाद (throw, catch) एक तंत्र प्रदान करते हैं जो त्रुटि का पता लगाने वाले कोड को त्रुटि संभालने वाले कोड से अलग करता है। यह बड़े प्रोग्रामों और लाइब्रेरीज़ में विशेष रूप से उपयोगी है जहाँ पता लगाने वाला पुनर्प्राप्ति नहीं जानता और हैंडलर त्रुटि का पता नहीं लगा सकता।
- त्रुटि रिपोर्ट करने के लिए
throw - त्रुटि संभालने के लिए
catch - पता लगाने और संभालने को अलग करता है
अपवाद सुरक्षा। स्टैंडर्ड लाइब्रेरी यह गारंटी देती है कि जब अपवाद फेंके जाते हैं तो ऑब्जेक्ट्स की स्थिति सुरक्षित रहती है। मूल गारंटी यह सुनिश्चित करती है कि कोई रिसोर्स लीक नहीं होगा और ऑब्जेक्ट्स वैध स्थिति में रहेंगे। मजबूत गारंटी यह सुनिश्चित करती है कि ऑपरेशन या तो सफल होगा या कोई प्रभाव नहीं डालेगा।
- मूल गारंटी (कोई रिसोर्स लीक नहीं, वैध स्थिति)
- मजबूत गारंटी (सभी या कुछ नहीं)
noexceptस्पेसिफायर
RAII के साथ एकीकरण। अपवाद प्रबंधन RAII के साथ गहराई से जुड़ा हुआ है। यह सुनिश्चित करता है कि जब अपवाद फैलता है और स्टैक अनवाइंडिंग होती है, तो ऑब्जेक्ट्स द्वारा अधिग्रहित संसाधन सही ढंग से मुक्त हो जाएं, जिससे रिसोर्स लीक से बचा जा सके और सफाई कोड सरल हो।
- सफाई के लिए RAII
- स्टैक अनवाइंडिंग के दौरान डेस्ट्रक्टर कॉल
समीक्षा सारांश
C++ प्रोग्रामिंग भाषा को व्यापक रूप से C++ के लिए सर्वश्रेष्ठ संदर्भ माना जाता है, जिसे इस भाषा के निर्माता ने लिखा है। इसकी व्यापक व्याख्या और महत्वपूर्ण जानकारियों के लिए इसकी प्रशंसा की जाती है, लेकिन कई समीक्षक इसे शुरुआती लोगों के लिए उपयुक्त नहीं मानते। इस पुस्तक को कभी-कभी जटिल और अधिक शब्दों में लिखा गया बताया जाता है, इसलिए इसे सीखने के साधन के बजाय संदर्भ के रूप में उपयोग करना बेहतर माना जाता है। अनुभवी प्रोग्रामर इसकी गहराई और तकनीकी विवरणों की सराहना करते हैं। कुछ लोग इसकी लेखन शैली और संगठन की आलोचना करते हैं, जबकि अन्य इसे C++ में महारत हासिल करने के लिए अनिवार्य मानते हैं। कुल मिलाकर, यह पेशेवरों के लिए एक महत्वपूर्ण संसाधन है, लेकिन नए सीखने वालों के लिए चुनौतीपूर्ण साबित हो सकती है।
लोग यह भी पढ़ते हैं