C++11: Difference between revisions
From Vigyanwiki
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
{{Short description|2011 edition of the C++ programming language standard}} | {{Short description|2011 edition of the C++ programming language standard}} | ||
{{distinguish|C11 ( | {{distinguish|C11 (सी मानक संशोधन)}} | ||
{{C++ language revisions}} | {{C++ language revisions}} | ||
[[C++]]11, C++ प्रोग्रामिंग भाषा के लिए मानकीकरण के लिए अंतर्राष्ट्रीय संगठन/अंतर्राष्ट्रीय [[इंटरनेशनल इलेक्ट्रोटेक्नीकल कमीशन]] मानक का एक संस्करण है। C++ 11 ने C++ मानक के पूर्व संस्करण को बदल दिया, जिसे C++ 03 कहा जाता है,<ref>{{cite web|title=We have an international standard: C++0x is unanimously approved|date=12 August 2011|url=http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/|access-date=12 August 2011|archive-date=11 December 2018|archive-url=https://web.archive.org/web/20181211080242/http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/|url-status=live}}</ref> और बाद में इसे [[C++14]] से बदल दिया गया। नाम विनिर्देश के प्रकाशन वर्ष द्वारा भाषा संस्करणों के नामकरण की परंपरा का पालन करता है, | [[C++]]11, C++ प्रोग्रामिंग भाषा के लिए मानकीकरण के लिए अंतर्राष्ट्रीय संगठन/अंतर्राष्ट्रीय [[इंटरनेशनल इलेक्ट्रोटेक्नीकल कमीशन]] मानक का एक संस्करण है। C++ 11 ने C++ मानक के पूर्व संस्करण को बदल दिया, जिसे C++ 03 कहा जाता है,<ref>{{cite web|title=We have an international standard: C++0x is unanimously approved|date=12 August 2011|url=http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/|access-date=12 August 2011|archive-date=11 December 2018|archive-url=https://web.archive.org/web/20181211080242/http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/|url-status=live}}</ref> और बाद में इसे [[C++14]] से बदल दिया गया। नाम विनिर्देश के प्रकाशन वर्ष द्वारा भाषा संस्करणों के नामकरण की परंपरा का पालन करता है, चूंकि इसे पूर्व में C++0x नाम दिया गया था क्योंकि यह 2010 से पहले प्रकाशित होने की उम्मीद थी।<ref>{{cite web|last1=Stroustrup|first1=Bjarne|title=C++11 FAQ|url=http://www.stroustrup.com/C++11FAQ.html|website=stroustrup.com|access-date=2014-10-15|archive-date=2018-10-06|archive-url=https://web.archive.org/web/20181006014513/http://www.stroustrup.com/C++11FAQ.html|url-status=live}}</ref> | ||
यद्यपि डिज़ाइन लक्ष्यों में से एक मुख्य भाषा में परिवर्तनों पर | यद्यपि डिज़ाइन लक्ष्यों में से एक मुख्य भाषा में परिवर्तनों पर लाइब्रेरी में परिवर्तनों को प्राथमिकता देना था,<ref>{{cite web|title=C++11 Overview: What specific design goals guided the committee?|url=https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals|website=Standard C++|access-date=2015-09-04|archive-date=2019-01-31|archive-url=https://web.archive.org/web/20190131050050/https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals|url-status=live}}</ref> C++ 11 मूल भाषा में कई बदलाव करता है। कोर लैंग्वेज के जिन क्षेत्रों में ज्यादा सुधार हुआ उनमें मल्टीथ्रेडिंग सपोर्ट, [[सामान्य प्रोग्रामिंग]] सपोर्ट, यूनिफॉर्म इनिशियलाइज़ेशन और परफॉर्मेंस सम्मिलित हैं। गणितीय विशेष कार्यों के पुस्तकालय को छोड़कर, C++ मानक पुस्तकालय में भी महत्वपूर्ण परिवर्तन किए गए, जिसमें अधिकांश C++ तकनीकी रिपोर्ट 1 (TR1) [[पुस्तकालय (कंप्यूटर विज्ञान)]] सम्मिलित थे।<ref>{{cite web|title=Bjarne Stroustrup: A C++0x overview|url=https://www.research.ibm.com/arl/seminar/media/stroustrup.pdf|access-date=30 June 2011|archive-date=17 June 2016|archive-url=https://web.archive.org/web/20160617024131/https://www.research.ibm.com/arl/seminar/media/stroustrup.pdf|url-status=live}}</ref> | ||
C++11 को ISO/IEC 14882:2011 के रूप में प्रकाशित किया गया था<ref>{{cite web | title = ISO/IEC 14882:2011 | publisher = ISO | date = 2 September 2011 | url = http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 | access-date = 3 September 2011 | archive-date = 29 January 2013 | archive-url = https://web.archive.org/web/20130129110331/http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 | url-status = live }}</ref> सितंबर 2011 में और शुल्क के लिए उपलब्ध है। प्रकाशित C++11 मानक के समान काम करने वाला मसौदा N3337 है, दिनांक 16 जनवरी 2012;<ref>{{cite web | title=Working Draft, Standard for Programming Language C++ | url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf | access-date=2012-04-26 | archive-date=2019-01-21 | archive-url=https://web.archive.org/web/20190121141340/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf | url-status=live }}</ref> इसमें C++11 मानक से केवल संपादकीय सुधार हैं।<ref>{{cite web | title =The Standard | url =http://isocpp.org/std/the-standard | access-date =2012-11-02 | archive-date =2019-05-13 | archive-url =https://web.archive.org/web/20190513104847/https://isocpp.org/std/the-standard | url-status =live }}</ref> | C++11 को ISO/IEC 14882:2011 के रूप में प्रकाशित किया गया था<ref>{{cite web | title = ISO/IEC 14882:2011 | publisher = ISO | date = 2 September 2011 | url = http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 | access-date = 3 September 2011 | archive-date = 29 January 2013 | archive-url = https://web.archive.org/web/20130129110331/http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 | url-status = live }}</ref> सितंबर 2011 में और शुल्क के लिए उपलब्ध है। प्रकाशित C++11 मानक के समान काम करने वाला मसौदा N3337 है, दिनांक 16 जनवरी 2012;<ref>{{cite web | title=Working Draft, Standard for Programming Language C++ | url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf | access-date=2012-04-26 | archive-date=2019-01-21 | archive-url=https://web.archive.org/web/20190121141340/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf | url-status=live }}</ref> इसमें C++11 मानक से केवल संपादकीय सुधार हैं।<ref>{{cite web | title =The Standard | url =http://isocpp.org/std/the-standard | access-date =2012-11-02 | archive-date =2019-05-13 | archive-url =https://web.archive.org/web/20190513104847/https://isocpp.org/std/the-standard | url-status =live }}</ref> | ||
== डिजाइन लक्ष्य == | == डिजाइन लक्ष्य == | ||
| Line 24: | Line 24: | ||
== सी ++ कोर भाषा == के लिए एक्सटेंशन | == सी ++ कोर भाषा == के लिए एक्सटेंशन | ||
सी ++ समिति का एक कार्य भाषा कोर का विकास है। कोर लैंग्वेज के जिन क्षेत्रों में | सी ++ समिति का एक कार्य भाषा कोर का विकास है। कोर लैंग्वेज के जिन क्षेत्रों में ज्यादा सुधार हुआ उनमें थ्रेड (कंप्यूटर साइंस) सपोर्ट, जेनेरिक प्रोग्रामिंग सपोर्ट, यूनिफॉर्म इनिशियलाइज़ेशन और परफॉर्मेंस सम्मिलित हैं। | ||
=== कोर लैंग्वेज रनटाइम परफॉरमेंस एन्हांसमेंट === | === कोर लैंग्वेज रनटाइम परफॉरमेंस एन्हांसमेंट === | ||
ये भाषा सुविधाएँ मुख्य रूप से स्मृति या कम्प्यूटेशनल गति के किसी प्रकार के प्रदर्शन लाभ प्रदान करने के लिए | ये भाषा सुविधाएँ मुख्य रूप से स्मृति या कम्प्यूटेशनल गति के किसी प्रकार के प्रदर्शन लाभ प्रदान करने के लिए सम्मिलित हैं। | ||
==== रेवल्यू रेफरेंस और मूव कंस्ट्रक्टर्स ==== | ==== रेवल्यू रेफरेंस और मूव कंस्ट्रक्टर्स ==== | ||
सी ++ 03 (और पहले) में, अस्थायी (मूल्य (कंप्यूटर विज्ञान) कहा जाता है, क्योंकि वे अक्सर असाइनमेंट के दाहिने तरफ झूठ बोलते हैं) का उद्देश्य कभी भी परिवर्तनीय नहीं होना चाहिए - जैसा कि सी में - और इन्हें अलग-अलग माना जाता है से <code>const T&</code> प्रकार; फिर भी, कुछ मामलों में, टेम्परेरी को संशोधित किया जा सकता था, एक ऐसा व्यवहार जिसे एक उपयोगी बचाव का रास्ता भी माना जाता था।<ref name="Sutter_Alexandrescu">सटर, अलेक्जेंड्रेस्कु C++ कोडिंग मानक #15</ref> C++11 एक नया गैर-कॉन्स्ट संदर्भ प्रकार (C++) जोड़ता है जिसे a कहा जाता है। {{visible anchor|rvalue reference}}, द्वारा पहचाना गया <code>T&&</code>. यह उन अस्थायी वस्तुओं को संदर्भित करता है जिन्हें चलने वाले शब्दार्थों की अनुमति देने के उद्देश्य से आरंभिक होने के बाद संशोधित करने की अनुमति दी जाती है। | सी ++ 03 (और पहले) में, अस्थायी (मूल्य (कंप्यूटर विज्ञान) कहा जाता है, क्योंकि वे अक्सर असाइनमेंट के दाहिने तरफ झूठ बोलते हैं) का उद्देश्य कभी भी परिवर्तनीय नहीं होना चाहिए - जैसा कि सी में - और इन्हें अलग-अलग माना जाता है से <code>const T&</code> प्रकार; फिर भी, कुछ मामलों में, टेम्परेरी को संशोधित किया जा सकता था, एक ऐसा व्यवहार जिसे एक उपयोगी बचाव का रास्ता भी माना जाता था।<ref name="Sutter_Alexandrescu">सटर, अलेक्जेंड्रेस्कु C++ कोडिंग मानक #15</ref> C++11 एक नया गैर-कॉन्स्ट संदर्भ प्रकार (C++) जोड़ता है जिसे a कहा जाता है। {{visible anchor|rvalue reference}}, द्वारा पहचाना गया <code>T&&</code>. यह उन अस्थायी वस्तुओं को संदर्भित करता है जिन्हें चलने वाले शब्दार्थों की अनुमति देने के उद्देश्य से आरंभिक होने के बाद संशोधित करने की अनुमति दी जाती है। | ||
| Line 35: | Line 35: | ||
C++11 में, ab:More C++ Idioms/Move Constructor|{{visible anchor|move constructor}}का <code>std::vector<T></code> जो एक के लिए एक प्रतिद्वंद्विता संदर्भ लेता है <code>std::vector<T></code> नए में रावल्यू से आंतरिक सी-शैली सरणी में पॉइंटर को कॉपी कर सकते हैं <code>std::vector<T></code>, फिर पॉइंटर को रावल्यू के अंदर शून्य पर सेट करें। चूंकि अस्थायी का फिर से उपयोग नहीं किया जाएगा, कोई भी कोड अशक्त सूचक तक पहुंचने का प्रयास नहीं करेगा, और क्योंकि सूचक शून्य है, जब यह दायरे से बाहर हो जाता है तो इसकी मेमोरी को हटाया नहीं जाता है। इसलिए, ऑपरेशन न केवल एक गहरी प्रतिलिपि की कीमत चुकाता है, बल्कि सुरक्षित और अदृश्य है। | C++11 में, ab:More C++ Idioms/Move Constructor|{{visible anchor|move constructor}}का <code>std::vector<T></code> जो एक के लिए एक प्रतिद्वंद्विता संदर्भ लेता है <code>std::vector<T></code> नए में रावल्यू से आंतरिक सी-शैली सरणी में पॉइंटर को कॉपी कर सकते हैं <code>std::vector<T></code>, फिर पॉइंटर को रावल्यू के अंदर शून्य पर सेट करें। चूंकि अस्थायी का फिर से उपयोग नहीं किया जाएगा, कोई भी कोड अशक्त सूचक तक पहुंचने का प्रयास नहीं करेगा, और क्योंकि सूचक शून्य है, जब यह दायरे से बाहर हो जाता है तो इसकी मेमोरी को हटाया नहीं जाता है। इसलिए, ऑपरेशन न केवल एक गहरी प्रतिलिपि की कीमत चुकाता है, बल्कि सुरक्षित और अदृश्य है। | ||
मानक पुस्तकालय के बाहर कोई बदलाव करने की आवश्यकता के बिना रेवल्यू संदर्भ मौजूदा कोड को प्रदर्शन लाभ प्रदान कर सकते हैं। एक लौटाने वाले फ़ंक्शन के दिए गए मान का प्रकार <code>std::vector<T></code> अस्थायी को स्पष्ट रूप से बदलने की आवश्यकता नहीं है <code>std::vector<T> &&</code> मूव कंस्ट्रक्टर को आमंत्रित करने के लिए, क्योंकि अस्थायी रूप से स्वचालित रूप से प्रतिद्वंद्विता माना जाता है। ( | मानक पुस्तकालय के बाहर कोई बदलाव करने की आवश्यकता के बिना रेवल्यू संदर्भ मौजूदा कोड को प्रदर्शन लाभ प्रदान कर सकते हैं। एक लौटाने वाले फ़ंक्शन के दिए गए मान का प्रकार <code>std::vector<T></code> अस्थायी को स्पष्ट रूप से बदलने की आवश्यकता नहीं है <code>std::vector<T> &&</code> मूव कंस्ट्रक्टर को आमंत्रित करने के लिए, क्योंकि अस्थायी रूप से स्वचालित रूप से प्रतिद्वंद्विता माना जाता है। (चूंकि, यदि <code>std::vector<T></code> एक सी ++ 03 संस्करण है जिसमें एक चालक कन्स्ट्रक्टर नहीं है, तो कॉपी कन्स्ट्रक्टर को एक के साथ बुलाया जाएगा <code>const std::vector<T>&</code>, एक महत्वपूर्ण मेमोरी आवंटन के कारण।) | ||
सुरक्षा कारणों से कुछ प्रतिबंध लगाए गए हैं। एक नामांकित चर को कभी भी प्रतिद्वंद्विता नहीं माना जाएगा, भले ही इसे इस तरह घोषित किया गया हो। एक प्रतिद्वंद्विता प्राप्त करने के लिए, फ़ंक्शन Template <code>std::move()</code> इस्तेमाल किया जाना चाहिए। रावल्यू संदर्भों को केवल कुछ परिस्थितियों में ही संशोधित किया जा सकता है, जिसका मुख्य रूप से मूव कंस्ट्रक्टर के साथ उपयोग करने का इरादा है। | सुरक्षा कारणों से कुछ प्रतिबंध लगाए गए हैं। एक नामांकित चर को कभी भी प्रतिद्वंद्विता नहीं माना जाएगा, भले ही इसे इस तरह घोषित किया गया हो। एक प्रतिद्वंद्विता प्राप्त करने के लिए, फ़ंक्शन Template <code>std::move()</code> इस्तेमाल किया जाना चाहिए। रावल्यू संदर्भों को केवल कुछ परिस्थितियों में ही संशोधित किया जा सकता है, जिसका मुख्य रूप से मूव कंस्ट्रक्टर के साथ उपयोग करने का इरादा है। | ||
| Line 44: | Line 44: | ||
सी ++ में हमेशा निरंतर अभिव्यक्ति की अवधारणा होती है। ये ऐसे भाव हैं <code>3+4</code> वह हमेशा एक ही परिणाम देगा, संकलन समय और रन टाइम पर। लगातार अभिव्यक्तियाँ संकलक के लिए अनुकूलन के अवसर हैं, और संकलक अक्सर [[संकलन-समय फ़ंक्शन निष्पादन]] और कार्यक्रम में परिणामों को हार्डकोड करते हैं। साथ ही, कई स्थानों पर, C++ विनिर्देशन के लिए निरंतर व्यंजकों का उपयोग करने की आवश्यकता होती है। एक सरणी को परिभाषित करने के लिए निरंतर अभिव्यक्ति की आवश्यकता होती है, और गणनाकर्ता मान निरंतर अभिव्यक्ति होना चाहिए। | सी ++ में हमेशा निरंतर अभिव्यक्ति की अवधारणा होती है। ये ऐसे भाव हैं <code>3+4</code> वह हमेशा एक ही परिणाम देगा, संकलन समय और रन टाइम पर। लगातार अभिव्यक्तियाँ संकलक के लिए अनुकूलन के अवसर हैं, और संकलक अक्सर [[संकलन-समय फ़ंक्शन निष्पादन]] और कार्यक्रम में परिणामों को हार्डकोड करते हैं। साथ ही, कई स्थानों पर, C++ विनिर्देशन के लिए निरंतर व्यंजकों का उपयोग करने की आवश्यकता होती है। एक सरणी को परिभाषित करने के लिए निरंतर अभिव्यक्ति की आवश्यकता होती है, और गणनाकर्ता मान निरंतर अभिव्यक्ति होना चाहिए। | ||
चूंकि, एक निरंतर अभिव्यक्ति को फ़ंक्शन कॉल या ऑब्जेक्ट कन्स्ट्रक्टर रखने की अनुमति नहीं दी गई है। तो कोड का एक टुकड़ा जितना सरल है उतना ही अमान्य है: | |||
int get_five() {वापसी 5;} | int get_five() {वापसी 5;} | ||
| Line 60: | Line 60: | ||
यह संकलक को समझने और सत्यापित करने की अनुमति देता है <code>get_five()</code> एक संकलन-समय स्थिरांक है। | यह संकलक को समझने और सत्यापित करने की अनुमति देता है <code>get_five()</code> एक संकलन-समय स्थिरांक है। | ||
का उपयोग करते हुए <code>constexpr</code> किसी फ़ंक्शन पर कुछ सीमाएं लगाई जाती हैं कि वह फ़ंक्शन क्या कर सकता है। सबसे पहले, फ़ंक्शन में एक गैर-शून्य रिटर्न प्रकार होना चाहिए। दूसरा, फ़ंक्शन बॉडी चर घोषित नहीं कर सकती है या नए प्रकारों को परिभाषित नहीं कर सकती है। तीसरा, शरीर में केवल घोषणाएँ, अशक्त कथन और एकल वापसी कथन हो सकते हैं। ऐसे तर्क मान | का उपयोग करते हुए <code>constexpr</code> किसी फ़ंक्शन पर कुछ सीमाएं लगाई जाती हैं कि वह फ़ंक्शन क्या कर सकता है। सबसे पहले, फ़ंक्शन में एक गैर-शून्य रिटर्न प्रकार होना चाहिए। दूसरा, फ़ंक्शन बॉडी चर घोषित नहीं कर सकती है या नए प्रकारों को परिभाषित नहीं कर सकती है। तीसरा, शरीर में केवल घोषणाएँ, अशक्त कथन और एकल वापसी कथन हो सकते हैं। ऐसे तर्क मान सम्मिलित होने चाहिए, जो तर्क प्रतिस्थापन के बाद, रिटर्न स्टेटमेंट में अभिव्यक्ति एक निरंतर अभिव्यक्ति उत्पन्न करते हैं। | ||
C++11 से पहले, वेरिएबल्स के मानों को निरंतर एक्सप्रेशंस में इस्तेमाल किया जा सकता है, अगर वेरिएबल्स को कॉन्स घोषित किया जाता है, एक इनिशियलाइज़र होता है जो एक कॉन्स्टेंट एक्सप्रेशन होता है, और इंटीग्रल या एन्यूमरेशन टाइप का होता है। सी ++ 11 प्रतिबंध को हटा देता है कि वेरिएबल्स अभिन्न या गणना प्रकार के होने चाहिए यदि उन्हें परिभाषित किया गया है <code>constexpr</code> कीवर्ड: | C++11 से पहले, वेरिएबल्स के मानों को निरंतर एक्सप्रेशंस में इस्तेमाल किया जा सकता है, अगर वेरिएबल्स को कॉन्स घोषित किया जाता है, एक इनिशियलाइज़र होता है जो एक कॉन्स्टेंट एक्सप्रेशन होता है, और इंटीग्रल या एन्यूमरेशन टाइप का होता है। सी ++ 11 प्रतिबंध को हटा देता है कि वेरिएबल्स अभिन्न या गणना प्रकार के होने चाहिए यदि उन्हें परिभाषित किया गया है <code>constexpr</code> कीवर्ड: | ||
| Line 98: | Line 98: | ||
# इसका कोई वर्चुअल बेस क्लास नहीं है | # इसका कोई वर्चुअल बेस क्लास नहीं है | ||
# इसके सभी गैर-स्थैतिक डेटा सदस्यों का एक ही अभिगम नियंत्रण (सार्वजनिक, निजी, संरक्षित) है | # इसके सभी गैर-स्थैतिक डेटा सदस्यों का एक ही अभिगम नियंत्रण (सार्वजनिक, निजी, संरक्षित) है | ||
# इसके सभी गैर-स्थैतिक डेटा सदस्य, इसके आधार वर्ग में कोई भी | # इसके सभी गैर-स्थैतिक डेटा सदस्य, इसके आधार वर्ग में कोई भी सम्मिलित है, पदानुक्रम में एक ही वर्ग में हैं | ||
# उपरोक्त नियम सभी आधार वर्गों और वर्ग पदानुक्रम में सभी गैर-स्थैतिक डेटा सदस्यों पर भी लागू होते हैं | # उपरोक्त नियम सभी आधार वर्गों और वर्ग पदानुक्रम में सभी गैर-स्थैतिक डेटा सदस्यों पर भी लागू होते हैं | ||
# इसमें पहले परिभाषित गैर-स्थैतिक डेटा सदस्य के समान प्रकार का कोई आधार वर्ग नहीं है | # इसमें पहले परिभाषित गैर-स्थैतिक डेटा सदस्य के समान प्रकार का कोई आधार वर्ग नहीं है | ||
| Line 122: | Line 122: | ||
=== कोर भाषा प्रयोज्य संवर्द्धन === | === कोर भाषा प्रयोज्य संवर्द्धन === | ||
भाषा को उपयोग में आसान बनाने के प्राथमिक उद्देश्य के लिए ये सुविधाएं | भाषा को उपयोग में आसान बनाने के प्राथमिक उद्देश्य के लिए ये सुविधाएं सम्मिलित हैं। ये प्रकार की सुरक्षा में सुधार कर सकते हैं, कोड पुनरावृत्ति को कम कर सकते हैं, गलत कोड की संभावना कम कर सकते हैं, आदि। | ||
==== प्रारंभकर्ता सूचियां ==== | ==== प्रारंभकर्ता सूचियां ==== | ||
| Line 135: | Line 135: | ||
वस्तु अदिश = {0.43f, 10}; // एक वस्तु, पहले = 0.43f और दूसरी = 10 के साथ ऑब्जेक्ट ऐरे [] = <nowiki>{{13.4f, 3}, {43.28f, 29}, {5.934f, 17}}</nowiki>; // तीन वस्तुओं की एक सरणी | वस्तु अदिश = {0.43f, 10}; // एक वस्तु, पहले = 0.43f और दूसरी = 10 के साथ ऑब्जेक्ट ऐरे [] = <nowiki>{{13.4f, 3}, {43.28f, 29}, {5.934f, 17}}</nowiki>; // तीन वस्तुओं की एक सरणी | ||
यह स्थैतिक सूचियों के लिए बहुत उपयोगी है, या किसी संरचना को कुछ मूल्य के लिए आरंभ करना है। सी ++ किसी ऑब्जेक्ट को प्रारंभ करने के लिए कन्स्ट्रक्टर भी प्रदान करता है, लेकिन वे अक्सर प्रारंभिक सूची के रूप में सुविधाजनक नहीं होते हैं। | यह स्थैतिक सूचियों के लिए बहुत उपयोगी है, या किसी संरचना को कुछ मूल्य के लिए आरंभ करना है। सी ++ किसी ऑब्जेक्ट को प्रारंभ करने के लिए कन्स्ट्रक्टर भी प्रदान करता है, लेकिन वे अक्सर प्रारंभिक सूची के रूप में सुविधाजनक नहीं होते हैं। चूंकि, सी ++ 03 प्रारंभिक-सूचियों को केवल उन संरचनाओं और कक्षाओं पर अनुमति देता है जो सादा पुराने डेटा (पीओडी) परिभाषा के अनुरूप हैं; सी ++ 11 प्रारंभकर्ता-सूचियों को बढ़ाता है, इसलिए इन्हें मानक कंटेनर समेत सभी वर्गों के लिए उपयोग किया जा सकता है <code>std::vector</code>. | ||
C++11 अवधारणा को एक टेम्प्लेट से बांधता है, जिसे कहा जाता है <code>std::initializer_list</code>. यह कंस्ट्रक्टर्स और अन्य फ़ंक्शंस को इनिशियलाइज़र-सूचियों को पैरामीटर के रूप में लेने की अनुमति देता है। उदाहरण के लिए: | C++11 अवधारणा को एक टेम्प्लेट से बांधता है, जिसे कहा जाता है <code>std::initializer_list</code>. यह कंस्ट्रक्टर्स और अन्य फ़ंक्शंस को इनिशियलाइज़र-सूचियों को पैरामीटर के रूप में लेने की अनुमति देता है। उदाहरण के लिए: | ||
| Line 161: | Line 161: | ||
function_name ({1.0f, -3.45f, -0.4f}); | function_name ({1.0f, -3.45f, -0.4f}); | ||
मानक पुस्तकालय में इसके उदाहरणों में | मानक पुस्तकालय में इसके उदाहरणों में सम्मिलित हैं <code>std::min()</code> और <code>std::max()</code> टेम्पलेट्स ले रहा है <code>std::initializer_list</code>संख्यात्मक प्रकार का। | ||
मानक कंटेनरों को इन तरीकों से भी आरंभ किया जा सकता है: | मानक कंटेनरों को इन तरीकों से भी आरंभ किया जा सकता है: | ||
| Line 170: | Line 170: | ||
==== यूनिफ़ॉर्म इनिशियलाइज़ेशन ==== | ==== यूनिफ़ॉर्म इनिशियलाइज़ेशन ==== | ||
सी ++ 03 में प्रारंभिक प्रकारों के साथ कई समस्याएं हैं। ऐसा करने के कई तरीके | सी ++ 03 में प्रारंभिक प्रकारों के साथ कई समस्याएं हैं। ऐसा करने के कई तरीके सम्मिलित हैं, और कुछ परस्पर विनिमय करने पर अलग-अलग परिणाम देते हैं। उदाहरण के लिए, पारंपरिक कन्स्ट्रक्टर सिंटैक्स, फ़ंक्शन घोषणा की तरह दिख सकता है, और यह सुनिश्चित करने के लिए कदम उठाए जाने चाहिए कि संकलक का सबसे परेशान पार्स नियम इस तरह की गलती नहीं करेगा। केवल समुच्चय और POD प्रकारों को कुल प्रारंभकर्ताओं के साथ प्रारंभ किया जा सकता है (का उपयोग करके <code>SomeType var = {/*stuff*/};</code>). | ||
C++11 एक सिंटैक्स प्रदान करता है जो किसी भी वस्तु पर काम करने वाले पूरी तरह से समान प्रकार के इनिशियलाइज़ेशन की अनुमति देता है। यह प्रारंभकर्ता सूची सिंटैक्स पर फैलता है: | C++11 एक सिंटैक्स प्रदान करता है जो किसी भी वस्तु पर काम करने वाले पूरी तरह से समान प्रकार के इनिशियलाइज़ेशन की अनुमति देता है। यह प्रारंभकर्ता सूची सिंटैक्स पर फैलता है: | ||
| Line 195: | Line 195: | ||
AltStruct var2{2, 4.3}; | AltStruct var2{2, 4.3}; | ||
का आरंभीकरण <code>var1</code> व्यवहार करता है जैसे कि यह कुल-प्रारंभिकरण था। यही है, किसी ऑब्जेक्ट के प्रत्येक डेटा सदस्य, बदले में, प्रारंभकर्ता-सूची से संबंधित मान के साथ प्रतिलिपि-प्रारंभिक किया जाएगा। जहां आवश्यक हो वहां निहित प्रकार के रूपांतरण का उपयोग किया जाएगा। यदि कोई रूपांतरण | का आरंभीकरण <code>var1</code> व्यवहार करता है जैसे कि यह कुल-प्रारंभिकरण था। यही है, किसी ऑब्जेक्ट के प्रत्येक डेटा सदस्य, बदले में, प्रारंभकर्ता-सूची से संबंधित मान के साथ प्रतिलिपि-प्रारंभिक किया जाएगा। जहां आवश्यक हो वहां निहित प्रकार के रूपांतरण का उपयोग किया जाएगा। यदि कोई रूपांतरण सम्मिलित नहीं है, या केवल एक संकुचित रूपांतरण सम्मिलित है, तो प्रोग्राम खराब रूप से बना हुआ है। का आरंभीकरण <code>var2</code> कंस्ट्रक्टर को आमंत्रित करता है। | ||
कोई यह भी कर सकता है: | कोई यह भी कर सकता है: | ||
| Line 218: | Line 218: | ||
==== टाइप अनुमान ==== | ==== टाइप अनुमान ==== | ||
सी ++ 03 (और सी) में, एक चर का उपयोग करने के लिए, इसके प्रकार को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। | सी ++ 03 (और सी) में, एक चर का उपयोग करने के लिए, इसके प्रकार को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। चूंकि, टेम्प्लेट प्रकार और टेम्प्लेट मेटाप्रोग्रामिंग तकनीकों के आगमन के साथ, किसी चीज़ का प्रकार, विशेष रूप से किसी फ़ंक्शन का अच्छी तरह से परिभाषित वापसी मूल्य, आसानी से व्यक्त नहीं किया जा सकता है। इस प्रकार, इंटरमीडिएट्स को वेरिएबल्स में स्टोर करना मुश्किल है, संभवतः किसी दिए गए मेटाप्रोग्रामिंग लाइब्रेरी के इंटर्नल्स के ज्ञान की आवश्यकता है। | ||
सी ++ 11 इसे दो तरीकों से कम करने की अनुमति देता है। सबसे पहले, एक स्पष्ट प्रारंभ के साथ एक चर की परिभाषा का उपयोग कर सकते हैं <code>auto</code> कीवर्ड।<ref>{{cite web |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1478.pdf |author1=Jaakko Järvi |author2=Bjarne Stroustrup |author3=Douglas Gregor |author4=Jeremy Siek |title=Decltype and auto, Programming Language C++, Document no: N1478=03-0061 |date=April 28, 2003 |access-date=June 6, 2015 |archive-date=May 28, 2015 |archive-url=https://web.archive.org/web/20150528112722/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1478.pdf |url-status=live }}</ref><ref>{{cite web|url=http://accu.org/index.php/journals/1859|title="Auto – A Necessary Evil?" Overload Journal #115|author=Roger Orr|date=June 2013|access-date=2015-06-06|archive-date=2015-06-06|archive-url=https://web.archive.org/web/20150606155637/http://accu.org/index.php/journals/1859|url-status=live}}</ref> यह विशिष्ट प्रकार के प्रारंभकर्ता का एक चर बनाता है: | सी ++ 11 इसे दो तरीकों से कम करने की अनुमति देता है। सबसे पहले, एक स्पष्ट प्रारंभ के साथ एक चर की परिभाषा का उपयोग कर सकते हैं <code>auto</code> कीवर्ड।<ref>{{cite web |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1478.pdf |author1=Jaakko Järvi |author2=Bjarne Stroustrup |author3=Douglas Gregor |author4=Jeremy Siek |title=Decltype and auto, Programming Language C++, Document no: N1478=03-0061 |date=April 28, 2003 |access-date=June 6, 2015 |archive-date=May 28, 2015 |archive-url=https://web.archive.org/web/20150528112722/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1478.pdf |url-status=live }}</ref><ref>{{cite web|url=http://accu.org/index.php/journals/1859|title="Auto – A Necessary Evil?" Overload Journal #115|author=Roger Orr|date=June 2013|access-date=2015-06-06|archive-date=2015-06-06|archive-url=https://web.archive.org/web/20150606155637/http://accu.org/index.php/journals/1859|url-status=live}}</ref> यह विशिष्ट प्रकार के प्रारंभकर्ता का एक चर बनाता है: | ||
| Line 235: | Line 235: | ||
decltype (some_int) अन्य_इंटीजर_वेरिएबल = 5; | decltype (some_int) अन्य_इंटीजर_वेरिएबल = 5; | ||
के साथ मिलकर यह अधिक उपयोगी है <code>auto</code>, क्योंकि auto चर का प्रकार केवल संकलक के लिए जाना जाता है। | के साथ मिलकर यह अधिक उपयोगी है <code>auto</code>, क्योंकि auto चर का प्रकार केवल संकलक के लिए जाना जाता है। चूंकि, <code>decltype</code> कोड में अभिव्यक्तियों के लिए भी बहुत उपयोगी हो सकता है जो [[ऑपरेटर ओवरलोडिंग]] और विशेष प्रकारों का भारी उपयोग करता है। | ||
<code>auto</code> कोड की वाचालता को कम करने के लिए भी उपयोगी है। उदाहरण के लिए, लिखने के बजाय | <code>auto</code> कोड की वाचालता को कम करने के लिए भी उपयोगी है। उदाहरण के लिए, लिखने के बजाय | ||
| Line 249: | Line 249: | ||
के लिए (स्थिरांक ऑटो और x: myvec) | के लिए (स्थिरांक ऑटो और x: myvec) | ||
यह अंतर बढ़ता है क्योंकि प्रोग्रामर नेस्ट कंटेनरों को शुरू करता है, | यह अंतर बढ़ता है क्योंकि प्रोग्रामर नेस्ट कंटेनरों को शुरू करता है, चूंकि ऐसे मामलों में <code>typedef</code>कोड की मात्रा कम करने का एक अच्छा तरीका है। | ||
द्वारा दर्शाया गया प्रकार <code>decltype</code> द्वारा निकाले गए प्रकार से भिन्न हो सकते हैं <code>auto</code>. | द्वारा दर्शाया गया प्रकार <code>decltype</code> द्वारा निकाले गए प्रकार से भिन्न हो सकते हैं <code>auto</code>. | ||
# | #सम्मिलित <वेक्टर> | ||
मुख्य प्रवेश बिंदु() | मुख्य प्रवेश बिंदु() | ||
{ | { | ||
| Line 302: | Line 302: | ||
====वैकल्पिक फ़ंक्शन सिंटैक्स ==== | ====वैकल्पिक फ़ंक्शन सिंटैक्स ==== | ||
सी (प्रोग्रामिंग लैंग्वेज) फंक्शन डिक्लेरेशन सिंटैक्स सी लैंग्वेज के फीचर सेट के लिए पूरी तरह से पर्याप्त था। चूंकि सी ++ सी से विकसित हुआ, इसने मूल सिंटैक्स रखा और जहां आवश्यक हो वहां इसे बढ़ाया। | सी (प्रोग्रामिंग लैंग्वेज) फंक्शन डिक्लेरेशन सिंटैक्स सी लैंग्वेज के फीचर सेट के लिए पूरी तरह से पर्याप्त था। चूंकि सी ++ सी से विकसित हुआ, इसने मूल सिंटैक्स रखा और जहां आवश्यक हो वहां इसे बढ़ाया। चूंकि, जैसे-जैसे C++ अधिक जटिल होता गया, इसने कई सीमाओं को उजागर किया, विशेष रूप से टेम्पलेट फ़ंक्शन घोषणाओं के संबंध में। उदाहरण के लिए, सी ++ 03 में यह अमान्य है: | ||
टेम्पलेट <कक्षा एलएचएस, कक्षा आरएचएस> | टेम्पलेट <कक्षा एलएचएस, कक्षा आरएचएस> | ||
| Line 331: | Line 331: | ||
} | } | ||
इस मामले में "ऑटो" कीवर्ड का उपयोग सिंटैक्स का हिस्सा है और सी ++ 11 में स्वचालित प्रकार की कटौती नहीं करता है। | इस मामले में "ऑटो" कीवर्ड का उपयोग सिंटैक्स का हिस्सा है और सी ++ 11 में स्वचालित प्रकार की कटौती नहीं करता है। चूंकि, C ++ 14 से शुरू होकर, अनुगामी रिटर्न प्रकार को पूरी तरह से हटाया जा सकता है और कंपाइलर रिटर्न प्रकार को स्वचालित रूप से घटा देगा।<ref>{{cite web|url=http://en.cppreference.com/w/cpp/language/auto|title=auto specifier (since C++11) - cppreference.com|website=en.cppreference.com|access-date=2016-10-18|archive-date=2016-10-20|archive-url=https://web.archive.org/web/20161020050910/http://en.cppreference.com/w/cpp/language/auto|url-status=live}}</ref> | ||
| Line 376: | Line 376: | ||
}; | }; | ||
ध्यान दें कि, इस मामले में, वही प्रभाव बनाकर हासिल किया जा सकता था <code>new_number</code> एक डिफ़ॉल्ट पैरामीटर। नया सिंटैक्स, | ध्यान दें कि, इस मामले में, वही प्रभाव बनाकर हासिल किया जा सकता था <code>new_number</code> एक डिफ़ॉल्ट पैरामीटर। नया सिंटैक्स, चूंकि, इंटरफ़ेस के बजाय कार्यान्वयन में डिफ़ॉल्ट मान (42) को व्यक्त करने की अनुमति देता है - लाइब्रेरी कोड के अनुरक्षकों के लिए एक लाभ क्योंकि फ़ंक्शन पैरामीटर के लिए डिफ़ॉल्ट मान कॉल साइट्स के लिए "बेक्ड इन" हैं, जबकि कन्स्ट्रक्टर प्रतिनिधिमंडल अनुमति देता है पुस्तकालय का उपयोग करके कोड के पुनर्संकलन के बिना मूल्य को बदला जाना है। | ||
यह एक चेतावनी के साथ आता है: सी ++ 03 किसी ऑब्जेक्ट को तब बनाया जाता है जब उसका कन्स्ट्रक्टर निष्पादित करना समाप्त कर देता है, लेकिन सी ++ 11 किसी भी कन्स्ट्रक्टर के निष्पादन को समाप्त करने के बाद निर्मित ऑब्जेक्ट पर विचार करता है। चूंकि कई कंस्ट्रक्टर्स को निष्पादित करने की अनुमति दी जाएगी, इसका मतलब यह होगा कि प्रत्येक डेलिगेटिंग कंस्ट्रक्टर अपने स्वयं के प्रकार के पूर्ण रूप से निर्मित ऑब्जेक्ट पर निष्पादित होगा। डिराइव्ड क्लास कंस्ट्रक्टर अपने बेस क्लास में सभी डेलिगेशन पूरा होने के बाद निष्पादित करेंगे। | यह एक चेतावनी के साथ आता है: सी ++ 03 किसी ऑब्जेक्ट को तब बनाया जाता है जब उसका कन्स्ट्रक्टर निष्पादित करना समाप्त कर देता है, लेकिन सी ++ 11 किसी भी कन्स्ट्रक्टर के निष्पादन को समाप्त करने के बाद निर्मित ऑब्जेक्ट पर विचार करता है। चूंकि कई कंस्ट्रक्टर्स को निष्पादित करने की अनुमति दी जाएगी, इसका मतलब यह होगा कि प्रत्येक डेलिगेटिंग कंस्ट्रक्टर अपने स्वयं के प्रकार के पूर्ण रूप से निर्मित ऑब्जेक्ट पर निष्पादित होगा। डिराइव्ड क्लास कंस्ट्रक्टर अपने बेस क्लास में सभी डेलिगेशन पूरा होने के बाद निष्पादित करेंगे। | ||
बेस-क्लास कंस्ट्रक्टर्स के लिए, C ++ 11 एक क्लास को यह निर्दिष्ट करने की अनुमति देता है कि बेस क्लास कंस्ट्रक्टर्स को इनहेरिट किया जाएगा। इस प्रकार, सी ++ 11 कंपाइलर इनहेरिटेंस करने के लिए कोड उत्पन्न करेगा और व्युत्पन्न वर्ग को बेस क्लास में अग्रेषित करेगा। यह एक ऑल-ऑर-नथिंग फीचर है: या तो उस बेस क्लास के सभी कंस्ट्रक्टर्स को फॉरवर्ड किया जाता है या उनमें से कोई भी नहीं है। साथ ही, एक इनहेरिटेड कंस्ट्रक्टर का नाम रिज़ॉल्यूशन (प्रोग्रामिंग लैंग्वेज) # नाम मास्किंग होगा यदि यह व्युत्पन्न वर्ग के एक कंस्ट्रक्टर के हस्ताक्षर से मेल खाता है, और कई इनहेरिटेंस के लिए प्रतिबंध | बेस-क्लास कंस्ट्रक्टर्स के लिए, C ++ 11 एक क्लास को यह निर्दिष्ट करने की अनुमति देता है कि बेस क्लास कंस्ट्रक्टर्स को इनहेरिट किया जाएगा। इस प्रकार, सी ++ 11 कंपाइलर इनहेरिटेंस करने के लिए कोड उत्पन्न करेगा और व्युत्पन्न वर्ग को बेस क्लास में अग्रेषित करेगा। यह एक ऑल-ऑर-नथिंग फीचर है: या तो उस बेस क्लास के सभी कंस्ट्रक्टर्स को फॉरवर्ड किया जाता है या उनमें से कोई भी नहीं है। साथ ही, एक इनहेरिटेड कंस्ट्रक्टर का नाम रिज़ॉल्यूशन (प्रोग्रामिंग लैंग्वेज) # नाम मास्किंग होगा यदि यह व्युत्पन्न वर्ग के एक कंस्ट्रक्टर के हस्ताक्षर से मेल खाता है, और कई इनहेरिटेंस के लिए प्रतिबंध सम्मिलित हैं: क्लास कंस्ट्रक्टर्स मल्टीपल इनहेरिटेंस नहीं हो सकते # डायमंड प्रॉब्लम। | ||
वाक्य रचना इस प्रकार है: | वाक्य रचना इस प्रकार है: | ||
| Line 486: | Line 486: | ||
ध्यान दें कि ऊपर दिए गए उदाहरण में foo(nullptr_t) वास्तव में foo(char *) को अंतर्निहित रूपांतरण का उपयोग करके कॉल करेगा, | ध्यान दें कि ऊपर दिए गए उदाहरण में foo(nullptr_t) वास्तव में foo(char *) को अंतर्निहित रूपांतरण का उपयोग करके कॉल करेगा, | ||
केवल तभी जब संगत पॉइंटर प्रकारों के दायरे में कोई अन्य फ़ंक्शन ओवरलोडिंग नहीं कर रहा हो। | केवल तभी जब संगत पॉइंटर प्रकारों के दायरे में कोई अन्य फ़ंक्शन ओवरलोडिंग नहीं कर रहा हो। | ||
यदि एकाधिक ओवरलोडिंग | यदि एकाधिक ओवरलोडिंग सम्मिलित हैं, तो संकल्प विफल हो जाएगा क्योंकि यह अस्पष्ट है, | ||
जब तक कि फू (nullptr_t) की स्पष्ट घोषणा न हो। | जब तक कि फू (nullptr_t) की स्पष्ट घोषणा न हो। | ||
| Line 532: | Line 532: | ||
==== समकोण कोष्ठक ==== | ==== समकोण कोष्ठक ==== | ||
सी ++ 03 का पार्सर परिभाषित करता है "<code>>></code>” सभी मामलों में राइट शिफ्ट ऑपरेटर या स्ट्रीम एक्सट्रैक्शन ऑपरेटर के रूप में। | सी ++ 03 का पार्सर परिभाषित करता है "<code>>></code>” सभी मामलों में राइट शिफ्ट ऑपरेटर या स्ट्रीम एक्सट्रैक्शन ऑपरेटर के रूप में। चूंकि, नेस्टेड टेम्प्लेट घोषणाओं के साथ, प्रोग्रामर के लिए दो समकोण कोष्ठकों के बीच एक स्थान रखने की उपेक्षा करने की प्रवृत्ति होती है, इस प्रकार एक कंपाइलर सिंटैक्स त्रुटि होती है। | ||
सी ++ 11 पार्सर के विनिर्देश में सुधार करता है | |||