Namespace (Lecture 35)-DOhMUTHrdJI 61.5 KB
Newer Older
Vandan Mujadia's avatar
Vandan Mujadia committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
C ++ में प्रोग्रामिंग(Programming) के मॉड्यूल(module) 20 में आपका स्वागत है।
 इस मॉड्यूल(module) में हम नेमस्पेसस(namespaces) के बारे में बात करेंगे।
 नेमस्पेसस(namespaces) लेक्सिकल स्कूपिंग(lexical scoping) की एक अवधारणा है, जिसमें से हमारे पास विभिन्न प्रकार के विकल्प हैं जिन्हें आप पहले से ही C ++ में जानते हैं।
 लेकिन, हम आपको स्कूपिंग(scoping) की इस अतिरिक्त अवधारणा के बारे में बताएंगे और यह कोड(code) संरचना को व्यवस्थित करने में कैसे मदद करता है।
 यह रूपरेखा है, और जैसे ही हम आगे बढ़ते हैं, आप इसे हर स्लाइड के बाईं ओर पाएंगे।
 इसलिए, पहले मुझे एक नेमस्पेस(namespace) का परिचय दें।
 एक नेमस्पेस(namespace), जैसा कि मैंने कहा कि एक घोषणात्मक क्षेत्र है; यह एक स्कोप(scope) है, इस तरह।
 इसलिए, हम पहले से ही स्कोप(scope) की ब्लॉक तरह के बारे में जानते हैं, हम जानते हैं कि हर फ़ंक्शन(function) में एक स्कोप(scope) है; हम जानते हैं कि क्लास(class) का एक स्कोप(scope) है, क्लास(class) का कुछ, क्लास(class) के नाम का स्कोप(scope) है।
 तो, नेमस्पेस(namespace) कुछ उसी के समान है।
 यहां हमारे पास एक स्कोप(scope) है यह एक घोषणात्मक क्षेत्र है, जिसके भीतर मेरे पास विभिन्न पहचानकर्ता, विभिन्न प्रतीकों की विविधता हो सकती है।
 हमारे पास प्रकार, फ़ंक्शंस(functions), चर, क्लास(class) और अन्य नेमस्पेस(namespace) और इतने पर हैं।
 जैसा कि मैंने कहा था कि प्रमुख उद्देश्य कोडिंग को तार्किक समूहों में व्यवस्थित करना है।
 और यह एक बहुत महत्वपूर्ण आवश्यकता है।
 और, एक प्रमुख कारण जो नेमस्पेस(namespace) मौजूद है, वह नाम क्लैश(name clash), नाम टकराव को रोकने के लिए है।
 विशेष रूप से, जब कोड(code) आधार में कई लिब्ररिएस(libraries) शामिल होते हैं, तो कोड(code) आधार उन नामों का उपयोग करने का इरादा रखता है जो तीसरे पक्ष के लिब्ररिएस(libraries) या मानक पुस्तकालय(library) द्वारा आरक्षित हैं, या कोड(code) आधार विकसित स्वतंत्र डेवलपर्स(developers) द्वारा विकसित किए गए हैं और अनजाने में नामों के एक ही सेट का उपयोग किया गया है।
 तो, यह मुख्य उद्देश्य है, यही नेमस्पेस(namespace) है, यह एक स्कोप(scope) को परिभाषित करता है और कोड(code) को व्यवस्थित करने का मुख्य उद्देश्य है।
 नेमस्पेस(namespace) एक क्लास(class) को मॉडर्लाइज़ेशन(modularization) प्रदान करता है, जैसे कि हम जानते हैं कि हर क्लास(class) की परिभाषा एक मॉड्यूलर(modular) परिभाषा की तरह है, लेकिन अंतर यह है कि इसमें कोई शब्दार्थ नहीं है।
 यह सिर्फ एक स्कूपिंग(scoping) नियम है, क्लास(class) स्कूपिंग(scoping) भी करती है, लेकिन यह क्लास(class) शब्दार्थ के साथ स्कूपिंग(scoping) करती है।
 अलग से नेमस्पेस(namespace) का कोई शब्दार्थ नहीं होगा।
 और, आपमें से जो C में फाइल स्कोप(scope) से परिचित हैं, जैसे कि हम कहते हैं कि एक फाइल स्टैटिक वैरिएबल(file static variable) या फाइल स्टैटिक फंकशन(function)(file static function) है, नेमस्पेस(namespace) के उपयोग से फाइल स्कोप(scope) की आवश्यकता समाप्त हो जाएगी, जैसा कि सी में उपयोग किया जाता है।
 यदि आप उसी का उपयोग कर रहे हैं, तो जब भी आपको आवश्यकता हो, आपको वास्तव में इसका उपयोग नहीं करना चाहिए और उस स्थान पर नेमस्पेस(namespace) का उपयोग करना चाहिए।
 मुझे आपको वास्तविक कोड(code) से परिचित कराना है कि इसे कैसे लिखना है, यह अन्यथा एक सार्थक उदाहरण नहीं है।
 तो यहाँ, मैं कह रहा हूँ नेमस्पेस(namespace) एक कीवर्ड(keyword) है जिसके साथ क्लास(class) कीवर्ड(keyword) जैसा आप करते हैं और उसके बाद नेमस्पेस(namespace) नाम होना चाहिए।
 तो, वाक्यविन्यास बहुत पसंद है कि आप एक क्लास(class) को कैसे परिभाषित करते हैं।
 घुंघराले ब्रेसिज़ से मेल खाने के मामले में इसका संबद्ध दायरा है, और जो कुछ भी आप उस नेमस्पेस(namespace) के भीतर लिखते हैं वह नेमस्पेस(namespace) से संबंधित है, जिसका अर्थ है कि आप इसके अंदर जो भी प्रतीक लिखते हैं वह नेमस्पेस(namespace) के नाम से योग्य हो जाता है।
 तो, यहाँ मैं 3 विभिन्न प्रकार की प्रविष्टियाँ दिखाता हूँ।
 एक चर का नाम है, मेरा डेटा(data), एक फ़ंक्शन(function) है और एक क्लास(class) है, myData, myFunction, MyClass है।
 और फिर, मुख्य में मैं दिखाता हूं कि इसका उपयोग कैसे करना है।
 यदि मुझे डेटा(data) का उपयोग करना है, तो मुझे इसे इस रूप में लिखना होगा।
 तो, आप देख सकते हैं कि चर नाम मेरा डेटा(data) था जो नेमस्पेस(namespace) नाम से योग्य हो गया है।
 यह ठीक इसी तरह है कि क्लास(class) के नाम कैसे योग्य हैं, उदाहरण के लिए, मैं तुरंत आपको क्लासएस(classes) में स्थैतिक(static) डेटा(data) सदस्यों के बारे में याद दिलाऊंगा कि आप क्लासएस(classes) में स्थैतिक(static) डेटा(data) सदस्यों को कैसे लिखते हैं।
 तो, नेमस्पेस(namespace) नाम के बाद प्रतीक नाम, स्कोप(scope) रिज़ॉल्यूशन ऑपरेटर(resolution operator) द्वारा अलग किया जाता है, यह नेमस्पेस(namespace) ऑब्जेक्ट को संदर्भित करने का एक तरीका है।
 उदाहरण के लिए, हमारे पास जो फ़ंक्शन(function) है, यह नाम, क्लास(class) के लिए, यह नाम है।
 नेमस्पेस(namespace) के इस संदर्भ में, यहां अगर मैं केवल MyFunction लिखता हूं और यह आह्वान करने की कोशिश करता हूं कि तब मुझे संकलन त्रुटि मिलेगी।
 क्योंकि, इस कार्यक्रम में मेरे कार्य नामक कोई प्रतीक नहीं है।
 मेरा फ़ंक्शन(myfunction) प्रतीक नेमस्पेस(namespace) के भीतर है और इसलिए हमेशा नेमस्पेस(namespace) के साथ उपसर्ग करना होगा।
 तो, यह एक मूल तरीका है जिससे आप नेमस्पेस(namespace) को परिभाषित करते हैं और आप नेमस्पेस(namespace) का उपयोग करते हैं।
 आइए हम दो परिदृश्यों पर ध्यान दें, एक सरल और एक थोड़ा और अधिक शामिल।
 यहां वह परिदृश्य है जहां मैं लाइब्रेरी फ़ंक्शन(library function) को फिर से परिभाषित करने की कोशिश कर रहा हूं।
 इसलिए, हम सभी जानते हैं कि लाइब्रेरी फ़ंक्शन(library function) में ABS फ़ंक्शन(function) होता है, मानक लाइब्रेरी में ABS फ़ंक्शन(function) होता है, जो निरपेक्ष मान पाता करता है, लेकिन मैं उसको एक अलग व्यवहार देना चाहता हूं।
 मैं यह कहना चाहता हूं कि -128 और 127 के भीतर यह पूर्ण मन धुनदेगा, लेकिन अन्यथा यदि यह उस सीमा के बाहर है तो यह एक शून्य वापस कर देगा।
 तो, यह करने का सरल तरीका, मैं abs फ़ंक्शन(function) को परिभाषित करता हूं और इसका उपयोग करना शुरू करता हूं, और इसका दूसरा पहलू यह है कि यदि हम ऐसा करते हैं, तो सी मानक लाइब्रेरी में मौजूद abs फ़ंक्शन(function) छिपा हुआ है, एक बार मेरे पास है मेरे abs फ़ंक्शन(function) को परिभाषित किया, फिर लाइब्रेरी से उपलब्ध abs फ़ंक्शन(function) अब और उपलब्ध नहीं है।
 इसलिए अगर मैं सिर्फ abs का उपयोग करता हूं, तो इसका मतलब यह होगा कि मेरे abs जिसका मतलब लाइब्रेरी में मौजूद abs से कभी नहीं होगा।
 इसलिए, मैं इसके द्वारा खो देता हूं यदि मैं सी में ऐसा करता हूं, तो हम इसे सी ++ में कर सकते हैं।
 मैं वास्तव में मूल लाइब्रेरी फ़ंक्शन(library function) को संदर्भित करने की क्षमता खो देता हूं।
 इसलिए, नेमस्पेस(namespace) एक अच्छा समाधान प्रदान करता है।
 अगर मैं ऐसा करना चाहता हूं और लाइब्रेरी फ़ंक्शन(library function) का भी जिक्र करना चाहता हूं, तब भी मैं अपने abs फंकशन(function) को डिफाइन कर सकता हूं, लेकिन मैं इसे नए नेमस्पेस(namespace) में डालूंगा।
 इसलिए, मैंने myNS के रूप में उस का नाम दिया है।
 तो, इसके साथ ही अगर मैं abs फ़ंक्शन(function) को अपने एनएस:: abs के रूप में संदर्भित करता हूं, तो यह इस फ़ंक्शन(function) को संदर्भित करता है।
 लेकिन अगर मैं अभी कहूं तो abs उपलब्ध नहीं है, क्योंकि abs का यह विशेष रूप से नया संस्करण myNS नाम के दायरे में है।
 इसलिए, अगर मैं सिर्फ abs कहता हूं, तो इसका मतलब है कि मानक लाइब्रेरी में मौजूद abs की अनुपस्थिति।
 इस तरह मैं अपनी नई शुरू की गई परिभाषाओं की रक्षा कर सकता हूं जो बिना लाइब्रेरी नाम के मौजूद हैं।
 यह एक बहुत ही विशिष्ट आवश्यकता है जिसका आप अक्सर सामना करेंगे और यह नेमस्पेस(namespace) का उपयोग करने का एक अच्छा समाधान है।
 मुझे जल्दी से एक विकास परिदृश्य के माध्यम से चलने दें।
 यह वही है जो किसी भी संगठन में नियमित रूप से होता है।
 मान लीजिए, एक संगठन छात्रों के रिकॉर्ड को संसाधित करने के लिए एक एप्लिकेशन(application) विकसित कर रहा है और बता दें कि दो क्लासएस(classes) हैं; छात्रों के लिए एक।
 तो, हमारे दो क्लासएस(classes) हैं; यह एक छात्र का प्रतिनिधित्व करता है और यह छात्रों की एक सूची का प्रतिनिधित्व करता है।
 आप वास्तव में विवरण के बारे में परेशान नहीं हो सकते हैं, हालांकि यह वास्तव में एक सही कार्यक्रम है।
 तो, आप बाद में पढ़े गए समय के माध्यम से पढ़ सकते हैं और वास्तव में यह पा सकते हैं कि यह कार्यक्रम क्या कर रहा है।
 यह निश्चित रूप से अलग है, इसमें कंस्ट्रक्टर(constructor) है, इसके पास कुछ सेट और फ़ंक्शन(function) हैं और इसके पास एक आउटपुट(output) ऑपरेटर(operator) है जो एक छात्र रिकॉर्ड लिखने में सक्षम है।
 और, इसकी एक सूची है और यह उन छात्रों की संख्या पर नज़र रखता है जो मौजूद हैं और इसमें इस सूची में एक छात्र को जोड़ने का विकल्प है।
 इसलिए, जब भी आप किसी छात्र को जोड़ते हैं तो उस छात्र का रोल नंबर आवंटित हो जाता है।
 इस प्रसंस्करण अनुप्रयोग को विकसित करने के संदर्भ में, संगठन क्या करता है और यह बहुत विशिष्ट है कि डिजाइनरों के किसी वरिष्ठ ने संभवतः इस क्लासएस(classes) को डिजाइन किया होगा।
 और फिर सिस्टम के विभिन्न हिस्सों को विकसित करने के लिए कई डेवलपर्स(developers) को कार्य दिया जाता है।
 तो, इन वर्गों को डिज़ाइन क्लासएस(classes) किया गया है और हेडर फ़ाइल(header file) में दिया गया है, Students.h।
 इस बिंदु पर जिम्मेदारी दी गई है; आइए हम इंजीनियरों से कहते हैं कि विकास को विभाजित करके, पुरुष छात्रों के लिए और महिला छात्रों के लिए अलग से।
 उनके पास छात्रावास की विभिन्न आवश्यकताएं, विषय वर्गीकरण की विभिन्न आवश्यकताएं आदि होंगी।
 तो, यह सविता द्वारा किया जा रहा है, पुरुष छात्रों के लिए; महिला छात्रों के लिए निलोय द्वारा किया जा रहा समान विकास; और पूर्णिमा उनका नेतृत्व है, जिन्हें अंततः इन दोनों अनुप्रयोगों को आपके अंतिम अनुप्रयोगों में एकीकृत करना है।
 तो क्या होता है, यह आकस्मिक, संयोग हो सकता है, जो भी हो, सविता इस पूरे प्रसंस्करण आवेदन को कॉल करती है जो वह पुरुष छात्रों के लिए प्रक्रिया छात्र(process students) के रूप में कर रही है; और, निलोय भी फ़ंक्शन(function) का एक ही नाम चुनता है।
 और फिर, उन्होंने जो कुछ भी विकसित किया है उसका परीक्षण करने के लिए स्वतंत्र मुख्य अनुप्रयोग लिखते हैं।
 आपको यह परेशान करने की आवश्यकता नहीं है कि यह क्या कर रहा है, यह मूल रूप से है, यदि यह एप्लिकेशन(application) पुरुष छात्रों को प्रिंट करता है, तो यह एप्लिकेशन(application) महिला छात्रों को प्रिंट करता है, लेकिन यह सिर्फ एक संकेत है कि मैं वास्तव में चिंतित नहीं हूं कि प्रसंस्करण क्या हो रहा है।
 लेकिन तथ्य यह है कि, उन्होंने संयोग से एक ही फ़ंक्शन(function) नाम चुना है और स्वतंत्र रूप से इसे एक साथ विकसित किया है।
 अब, दोनों ने पूर्णिमा को कोड(code) जमा कर दिया, जो प्रमुख है, अब पूर्णिमा को उन्हें एक साथ रखना है।
 इसलिए, निश्चित रूप से, अगर हम सिर्फ एक बार वापस आते हैं, तो पूर्णिमा न तो इस मुख्य का उपयोग करेगी, और न ही इस मुख्य का उपयोग करेगी, क्योंकि उसे इस दोनों कोड(code) को एकीकृत करना है।
 तो, उसे सभी के लिए एक मुख्य एकीकृत आवेदन लिखना होगा।
 तो, वह लिखने की कोशिश करती है।
 तो, उसे इन कार्यों को कॉल करना होगा, प्रक्रिया छात्रों(process students’) फंकशनस।
 उसे अपनी परिभाषाएँ ऊपर रखनी होती हैं और वह पाता है कि, दोनों एक ही फ़ंक्शन(function) नाम का उपयोग करते हैं।
 तो, अगर वह उनके कोड(code) की नकल करेगी, तो यह वही है जो ऐसा लगेगा।
 जैसा कि आप समझ सकते हैं कि यह एक नाम क्लैश देगा और यह समान नहीं हो सकता है, यह बस संकलन नहीं करेगा।
 अब, संपूर्ण एकीकरण प्रक्रिया विफल हो गई है।
 मैंने केवल एक संकेत के रूप में एक फ़ंक्शन(function) नाम के रूप में दिखाया है, लेकिन वास्तव में, निश्चित रूप से, आवेदन हजारों लाइनों के जोड़े में होगा।
 कई प्रतीक, कई कार्य, वैश्विक चर, क्लास(class) नाम, कई प्रकार और इतने पर हो सकते हैं, जो दोनों डेवलपर्स(developers) के बीच एक ही नाम हो सकते हैं।
 अधिक डेवलपर भी हो सकते हैं।
 ऐसा हो सकता है कि कुछ मामलों में, दो डेवलपर्स(developers) के कार्यक्रमों या कोड(code) के बीच समान नाम का मतलब एक ही बात है; कुछ मामलों में, सविता द्वारा इस्तेमाल किया गया एक ही नाम, निलोय द्वारा एक अलग अर्थ में उपयोग किया जाएगा।
 तो, यह एक बहुत ही कठिन समस्या है।
 अगर पूर्णिमा को एकीकृत करना है, तो उसे पूरे कोड(code) को समझना होगा और फिर संपादित करना होगा और उसके भीतर बदलाव करना होगा और यह पूरी तरह से बुरा सपना बन जाएगा।
 तो, यह वही है जिसे एकीकरण दुःस्वप्न के रूप में जाना जाता है जो आमतौर पर एक संगठन में होता है।
 लेकिन, इस तथ्य का दूसरा पहलू स्वतंत्र रूप से है कि दोनों आवेदन पुरुष छात्रों के लिए सविता द्वारा और स्वतंत्र रूप से काम करने वाली महिला छात्रों के लिए निलोय द्वारा विकसित किए गए हैं, यह केवल यह है कि, वे कुछ कॉमन नामों को साझा कर रहे हैं और इसलिए नेमस्पेस(namespace) एक पानाकेय(panacea) बन जाता है जो इस समस्या को बहुत आसानी से हल कर सकता है।
 पूर्णिमा को अब उन सभी अनुप्रयोगों को लेना है जो सविता ने विकसित किए थे और निलोय ने विकसित किए थे और उन्हें दो अलग-अलग नामस्थानों में रखा था।
 वह दो नामों, ऐप 1 और ऐप 2 पर निर्णय लेती है और सविता के घटनाक्रम को इसमें डालती है, निलोय के घटनाक्रम को इसमें डालती है।
 तो, एक बार जो किया गया है, तो इस एप्लिकेशन(application) के भीतर, यह सभी एक ही नेमस्पेस(namespace) के भीतर है।
 तो, आवेदन अभी भी काम करता है।
 यह भाग तब भी काम करेगा, लेकिन जब आप बाहर होंगे जब आप मुख्य कार्यों के दृष्टिकोण से देख रहे होंगे तो ये दोनों दो अलग-अलग नेमस्पेस(namespace) में होंगे।
 तो, वे मूल रूप से, विभिन्न कार्य हैं।
 इसलिए, फिर वह उन्हें नेमस्पेस(namespace) में संलग्न करने के बाद वापस आ जाएगा।
 अब, वह वापस एकीकरण में है।
 यह है, सविता के अनुप्रयोग अब ऐप 1 नेमस्पेस(namespace) में छात्रों के कार्य करने में काफी प्रक्रिया कर रहे हैं; निलोय के लिए, यह ऐप 2 नेमस्पेस(namespace) में है।
 इसलिए, उसे जो कुछ भी करने की जरूरत है, वह यह करते हुए, उसने दो विकास इकाइयों के बीच और आवेदन के संदर्भ में, नाम का टकराव हल कर लिया है, उसे बस इतना करना है कि नेमस्पेस(namespace) उपसर्ग का उपयोग करें और दो कार्यों को कॉल करें स्वतंत्र रूप से, एक के बाद एक या वह जो भी करना चाहती है।
 तो, यह एक बहुत ही विशिष्ट दृष्टिकोण है, जो व्यावहारिक एकीकरण समस्या की एक बड़ी मात्रा को हल कर सकता है और इसे ध्यान में रखा जाना चाहिए।
 बेशक, यह एक अच्छा विचार नहीं है कि एक ही सिस्टम में कई डेवलपर्स(developers) अलग-अलग नामों के समन्वय और समाधान करने में सक्षम नहीं होंगे, लेकिन यह अक्सर एक अच्छा विचार हैनेमस्पेस का उपयोग करने के लिए भी अलग-अलग मॉड्यूल(module) बनाने के लिए ताकि विभिन्न मॉड्यूलों के बीच आपको वास्तव में क्या नाम, क्या विभिन्न सहायक कार्य, सहायक कक्षाएं और उन सभी के बारे में परेशान नहीं करना पड़ेगा।
 इसलिए, यदि हम एक छात्र रिकॉर्ड विकास कर रहे हैं, तो एक मॉड्यूल(module) हो सकता है जो मुख्य रूप से छात्रों के शैक्षणिक भाग के साथ काम करता है; एक मॉड्यूल(module) छात्रों की फीस से संबंधित है; एक छात्रावास के साथ एक मॉड्यूल(module) संबंधित है; एक अन्य मॉड्यूल(module) उनकी समय सारिणी और इसी तरह से निपटेगा।
 तो, कोड(code) को व्यवस्थित करने और डिजाइन करने का एक अच्छा तरीका इस मॉड्यूल(module) को अलग नेमस्पेस(namespace) आवंटित करना होगा और मूल रूप से उस तरीके से कोड(code) को अलग करना होगा, ताकि आप यह सुनिश्चित कर लें कि यह आपस में कभी नहीं टकराएगा।
 इसलिए, मुझे केवल उस चर्चा को पूरा करने की आवश्यकता है, जिसे आपने समझा है कि नेमस्पेस(namespace) क्यों महत्वपूर्ण है।
 तो, मुझे केवल उन त्वरित विशेषताओं पर जाने की आवश्यकता है जो एक नेमस्पेस(namespace) है।
 जैसा कि मैंने कहा, यह क्लास(class) के समान है; क्लास(class) की तरह, नेमस्पेस(namespace) को नेस्टेड(nested) किया जा सकता है।
 तो, मेरे पास एक नेमस्पेस(namespace) नाम 1 यहाँ है और उसके भीतर मेरा एक और नेमस्पेस(namespace) है।
 तो, यह सब होता है, अगर मैं एक नेमस्पेस(namespace) को दूसरे में घोंसला देता हूं, तो इस नेस्टेड नेमस्पेस(namespace) का नाम बाहरी नेमस्पेस(namespace) द्वारा योग्य है।
 तो, यह साधारण बात है।
 तो, जिसका अर्थ है कि यह डेटा(data) नेमस्पेस(namespace) नाम 1 में है, जबकि, यह डेटा(data) नाम 1 के नेमस्पेस(namespace) में है:: नाम 2, क्योंकि यह स्वयं का नाम 1:: नाम 2 है।
 इसलिए, यदि हम इस कोड(code) को लिखते हैं, अगर मैं सिर्फ लिखता हूं डेटा(data) फिर, डेटा(data) केवल बाहर है तो इसका मतलब यह डेटा(data) होगा।
 अगर मैं नाम 1:: डेटा(data) लिखता हूं, तो इस डेटा(data) का मतलब है, अगर मैं name1 लिखता हूं:: नाम 2:: डेटा(data), इसका मतलब यह डेटा(data) है।
 इसलिए, जैसा कि आप नेमस्पेस(namespace) के नेस्टिंग करते हैं, अधिक से अधिक उपसर्ग जुड़ जाते हैं।
 तो, नेमस्पेस(namespace) के लिए किसी भी स्तर का घोंसला बनाना संभव है।
 अक्सर, यदि आप इसे इस तरह करते हैं तो यह मुश्किल हो सकता है कि जैसे आपके पास कई घोंसले और कई प्रतीक हैं जो आप उपयोग करना चाहते हैं, हर बार आपको नेमस्पेस(namespace) नाम डालना होगा।
 तो, एक शॉर्टकट है जिसे आप उपयोग कर सकते हैं।
 मूल रूप से दो शॉर्टकट हैं जिनका आप उपयोग कर सकते हैं; इनमें से एक का उपयोग कर कहा जाता है।
 तो, एक शॉर्टकट जो आप कर सकते हैं, वह है आप का उपयोग करना और फिर आप एक नेमस्पेस(namespace) का नाम रखते हैं।
 तो, आप नेमस्पेस(namespace) नाम 1 का उपयोग करते हुए कहते हैं।
 इसका मतलब यह होगा कि कोई प्रतीक है जो बाद में इसका उपयोग किया जाता है; आप यह जाँचने का प्रयास करेंगे कि क्या इस नेमस्पेस(namespace) का नाम 1 में प्रतीक है।
 और अगर उसमें वह प्रतीक है तो आप उस प्रतीक का जिक्र करेंगे।
 तो, यह नेमस्पेस(namespace) का उपयोग करने की विशेषता है।
 अन्य सुविधा का उपयोग कर रहा है, आप का उपयोग कर कह सकते हैं और आप कह सकते हैं कि, वास्तव में एक योग्य प्रतीक है।
 इसलिए, यदि आप एक योग्य प्रतीक को निर्दिष्ट करते हैं, तो योग्य प्रतीक को नाम दें, जब भी बाद में आप सिर्फ प्रतीक के नाम के बारे में बात करते हैं, तो इसका मतलब होगा कि यह योग्य प्रतीक है।
 तो, इस उदाहरण को मदद करनी चाहिए।
 तो, मेरे पास दो नेमस्पेस(namespace), name1 और name2 हैं; name1 के दो प्रतीक हैं; name2 दो प्रतीकों के रूप में; और, मेरे पास name1, namespace name1 पर एक उपयोग है और मेरे पास इस विशेष प्रतीक, name2 के चर पर एक प्रयोग है।
 तो, क्या होता है? अगर मैं v11 कहूं, तो यह क्या जाँच करेगा? यह जांच करेगा कि मैं नेमस्पेस(namespace) नाम 1 का उपयोग कर रहा हूं।
 तो, क्या वी 11 उस नेमस्पेस(namespace) में मौजूद है; ऐसा होता है।
 तो, यह इसके साथ जुड़ता है।
 अगर मैं कहता हूं, तो name1: v 12, यह यहां संबद्ध होगा।
 इसलिए, आप देख सकते हैं कि जब मैं इसका उपयोग कर रहा हूं तब भी यह अनिवार्य नहीं है कि मुझे संक्षिप्त रूप का उपयोग करना होगा।
 यह कहने के स्थान पर, मैं केवल v12 लिख सकता था; यह भी name1 में एक ही चर का उल्लेख किया है, क्योंकि मैं एक namepace name1 का उपयोग कर रहा हूँ।
 लेकिन, यह अनिवार्य नहीं है कि मैं उपयोग करने वाले शॉर्टकट का उपयोग कर सकता हूं या मैं पूरी तरह से योग्य नाम का उपयोग भी कर सकता हूं, जैसा कि मैंने यहां किया है।
 V21.v21 के बारे में सोचें इसका मतलब यह होगा।
 क्यूं? मैं नेमस्पेस(namespace) नाम 2 का उपयोग नहीं करता हूं।
 लेकिन, मैं इस विशेष प्रतीक पर ही प्रयोग कर रहा हूं।
 इसलिए, अगर मैं v21 कहता हूं तो इसका मतलब है कि, यह name2:: v21 है और यह सही होगा।
 इसी तरह, मैं सीधे तरीके अभी भी इसका उल्लेख कर सकता हूँ, यह कहकर नाम 2 :: v21; यह भी अनुमति है; नाम के स्पष्ट उपयोग की अनुमति है।
 V22 के बारे में सोचो; v22 यहाँ है।
 मुझे name2 नेमस्पेस(namespace) पर उपयोग करने की आवश्यकता नहीं है।
 इसलिए, v22 का मतलब यह नहीं हो सकता है, यह विशेष इकाई न तो मेरे पास एक उपयोग है, जैसे name2 :: v22; मेरे पास वह नहीं है।
 इसलिए, कंपाइलर(compiler) इस कोड(code) में कोई v22 सिंबल नहीं देख सकता है और कंपाइलर(compiler) इसे अपरिभाषित मान लेगा।
 यह कहेगा, v22 नाम का कोई प्रतीक नहीं है।
 यह उपयोग करने का एक मूल उपयोग है; जैसे, आप इसे पूरे कोड(code) में देख रहे हैं, अब तक मैंने शुरू में ही उल्लेख किया था कि, हम इसे लिखते रहेंगे क्योंकि मानक पुस्तकालय(library) के सभी प्रतीक नेमस्पेस(namespace) के std में हैं।
 तो, इसे लिखने से हमारा जीवन आसान हो जाता है अन्यथा, आपके cout को std:: out के रूप में लिखना होगा; Cin as std :: cin वगैरह।
 अब, हम वैश्विक नेमस्पेस(namespace) के बारे में भी बात करते हैं।
 मान लीजिए, मेरे पास एक उदाहरण है।
 उदाहरण को समझते हैं; मेरे पास एक वैरिएबल है जो वैश्विक स्कोप(scope) डेटा(data) में लिखा गया है।
 नेमस्पेस(namespace) नाम 1 में, मेरे पास एक चर डेटा(data) है।
 अब, जैसे वे रेसोलवाबले(resolvable) हैं यदि आप नीचे दिए गए इस कार्यक्रम के बारे में नहीं सोचते हैं, तो वे रेसोलवाबले(resolvable) हैं, क्योंकि अगर मैं डेटा(data) लिखता हूं, तो इसका मतलब यह है और, अगर मैं name1:: data लिखता हूं तो इसका मतलब यह है, स्पष्ट।
 लेकिन, इस फ़ंक्शन(function) मैन(main) मे मान लें, मेरे पास name1:: data, right का उपयोग है।
 तो इसका क्या अर्थ है? इसका मतलब है कि, अब अगर मैं डेटा(data) के बारे में बात करता हूं, तो इसका मतलब है कि यह डेटा(data); अब इस डेटा(data) का मतलब यह नहीं है; क्योंकि, मुझे name1:: डेटा(data) का उपयोग करना है।
 तो, यह कहता है कि, name1:: डेटा(data) को इस बिंदु पर, उसके बाद से डेटा(data) के रूप में जाना जाएगा।
 इसलिए, यदि मैं डेटा(data) कहता हूं, तो मुझे यह मिलता है।
 अगर मैं name1 :: data कहता हूं, तो मुझे यह भी मिलता है।
 तो, इसका मतलब यह है कि, मैंने उस डेटा(data) तक पहुंच प्राप्त करने की क्षमता खो दी है जो नेमस्पेस(namespace) में परिभाषित नहीं था, जिसे बाहर परिभाषित किया गया है।
 तो, C ++ हमें उन प्रतीकों को एक्सेस करने में सक्षम होने के लिए एक तंत्र देता है, जो वैश्विक अंतरिक्ष में हैं, जो वैश्विक दायरे में हैं।
 आप जो कुछ भी करते हैं, आप एक ही संकेतन का उपयोग करते हैं, लेकिन सिर्फ यह कि वैश्विक, विचार एक तरह का है, वैश्विक स्कोप(scope) भी है जैसे कि किसी नेमस्पेस(namespace) पर, लेकिन उस नेमस्पेस(namespace) का कोई नाम नहीं है।
 तो, यह सिर्फ एक खाली नाम है।
 तो, आप जो कुछ भी करते हैं वह सिर्फ :: डेटा(data) डाल दिया जाता है।
 तो, इसका मतलब हमेशा वैश्विक स्कोप(scope) में नाम होगा।
 तो, यह वैश्विक नेमस्पेस(namespace) की एक मूल अवधारणा है जो मौजूद है।
 मानक नेमस्पेस(namespace), इसलिए हम इस बारे में बात कर रहे हैं कि, सभी C ++ अपने सभी मानक पुस्तकालय(library) प्रतीकों, वर्गों, कार्यों, सब कुछ को std नेमस्पेस(namespace) में रखता है।
 इसलिए, यदि हम केवल IO स्ट्रीम को शामिल करते हैं और करना चाहते हैं, तो इसका उपयोग करके एक प्रोग्राम लिखें, फिर हर बार हमें std :: के साथ प्रतीक को उपसर्ग करना होगा।
 उदाहरण के लिए, अगर मुझे एंडल(endl) लिखना है, तो मुझे इसे std :: endl, एंडलाइन के रूप में लिखना होगा।
 इसलिए, हम नेमस्पेस(namespace) std का उपयोग करके एक शॉर्टकट कर सकते हैं।
 इसका क्या मतलब होगा, अगर मैं cout लिखता हूं, तो यह भी जांच करेगा कि std नेमस्पेस(namespace) में cout है या नहीं; यह एक है।
 तो, एसटीडी(std) उसी से संबंधित होगा।
 तो, std नेमस्पेस(namespace) सबसे महत्वपूर्ण नेमस्पेस(namespace) है जो हमारे लिए उपलब्ध है।
 अधिक नेमस्पेसस(namespaces) के जोड़े भी परिभाषित किए गए हैं।
 हम बाद में उन पर बात करेंगे।
 नेमस्पेस(namespace) के बारे में एक बहुत ही दिलचस्प अवधारणा है नेमस्पेस(namespace) खुले हैं, इस अर्थ में; एक क्लास(class) के बारे में सोचें यदि आप केवल एक क्लास(class) को परिभाषित करते हैं, तो आप उस क्लास(class) के भीतर जो भी प्रतीक रखते हैं, डेटा(data) सदस्य, फ़ंक्शन(function) और इतने पर, मित्र और उन सभी को जो क्लास(class) की एक अभिन्न परिभाषा में डालते हैं।
 और, एक बार वह स्कोप(scope) खत्म हो गई तो आप क्लास(class) के उस स्कोप(scope) में नए प्रतीकों को नहीं जोड़ सकते।
 लेकिन नेमस्पेस(namespace) में, वह अलग है।
 तो, नेमस्पेस(namespace) के खुले होने का यही मतलब है।
 इसलिए यहाँ, मैंने एक नेमस्पेस(namespace) खुला बनाया है, जहाँ मैंने एक प्रतीक x लगाया है।
 स्कोप(scope) बंद है; यह यहाँ से शुरू हुआ, इसने इसे यहाँ बंद कर दिया।
 लेकिन फिर, मैं फिर से कहता हूं कि नेमस्पेस(namespace) खुला और दूसरा प्रतीक रखा; वह है ... तो, जो होता है, यह उसी दायरे में जुड़ जाएगा।
 अब, यह मूल रूप से कहता है, नेमस्पेस(namespace) ओपन के दो प्रतीक हैं, प्रतीक x और साथ ही प्रतीक y।
 तो, बस अगर हम नेमस्पेस(namespace) ओपन का उपयोग करके कहते हैं तो मैं एक्स और वाई दोनों का उपयोग कर सकता हूं और एक ही नेमस्पेस(namespace) से, वे करेंगे, एक्स यहां बांध देगा और वाई यहां बांध देगा।
 तो, यह खुलापन एक दिलचस्प अवधारणा है जो बहुत ही लचीली है, ताकि, आप कई, अलग-अलग फाइलों में भी, नेमस्पेस(namespace) के विभिन्न हिस्सों को निर्दिष्ट कर सकें।
 जब से हम बात कर रहे हैं, क्लास(class) की अवधारणा का बार-बार जिक्र करते हैं और नेमस्पेस(namespace) से तुलना करते हैं, यह उस तुलना का सिर्फ एक सारांश है।
 नेमस्पेस(namespace) और क्लास(class) के बीच हर नेमस्पेस(namespace) एक क्लास(class) नहीं है और बदले में प्रत्येक क्लास(class) एक नेमस्पेस(namespace) को परिभाषित करता है।
 यह आपको समान योग्यता क्षमता प्रदान करता है।
 नेमस्पेस(namespace) फिर से खोला जा सकता है, लेकिन अधिक घोषणाओं में डाल दिया।
 क्लास(class) के संदर्भ में, ऐसा कुछ नहीं है।
 निश्चित रूप से, नेमस्पेस(namespace) को तत्काल नहीं किया जा सकता है; क्लासएस(classes) को वस्तुओं के लिए तात्कालिक माना जाता है।
 नेमस्पेस(namespace) के लिए तंत्र का उपयोग करना उपलब्ध है; निश्चित रूप से, क्लास(class) के लिए ऐसा करने का कोई अर्थ नहीं है।
 और दिलचस्प बात यह है कि एक नेमस्पेस(namespace) अनाम हो सकता है; मेरे पास कुछ प्रतीकों को अलग करने और सिर्फ उन्हें एक साथ रखने के लिए एक नेमस्पेस(namespace) हो सकता है, लेकिन उन्हें बाहर से एक्सेस करने के लिए नहीं।
 देखें, आपको नेमस्पेस(namespace) के नामों की आवश्यकता क्यों है ताकि बाहर से, घोषणा पत्र का उपयोग करके या सीधे आप नेमस्पेस(namespace) के अंदर प्रतीकों का उपयोग कर सकें।
 अब, यदि मैं केवल कुछ प्रतीकों को नेत्रहीन रूप से छिपाना चाहता हूं और बस उन्हें आपस में बातचीत करना चाहता हूं तो मैं उन्हें एक नेमस्पेस(namespace) में रख सकता हूं और उस नेमस्पेस(namespace) को कोई नाम नहीं दूंगा।
 अगर मैं उस नेमस्पेस(namespace) को कोई नाम नहीं देता हूं, तो उस नेमस्पेस(namespace) के बाहर के किसी भी व्यक्ति के पास उस नेमस्पेस(namespace) का प्रतीक नहीं है।
 तो, अनाम नेमस्पेस(namespace) का एक अर्थ है; जाहिर है अनाम क्लास(class) अर्थहीन है।
 इसकी अनुमति नहीं है।
 इससे पहले कि मैं बंद करूं, मैं आपको सिर्फ यह याद दिलाना चाहूंगा कि, नेमस्पेस(namespace) विभिन्न लेक्सिकल(lexical) क्लासएस(classes) में से एक है जो C ++ परिभाषित करता है।
 और, यह सिर्फ यह है कि ये अलग-अलग लेक्सिकल स्कोप(scope) हैं जो आपके पास हैं।
 अभिव्यक्ति का दायरा वह होता है, जहां अस्थायी लोगों का उपयोग किसी अभिव्यक्ति के विभिन्न भागों की गणना के लिए किया जाता है और उनके पास अभिव्यक्ति के भीतर एक स्कोप(scope) होती है।
 सबसे अधिक बार, हमें ये अस्थायी चीजें देखने को नहीं मिलती हैं।
 तो, यह केवल कोंपिलेर(compiler) है जो इसे संभालता है।
 लेकिन, हम अक्सर ब्लॉक और फंकशन(function) स्कोप(scope) से निपटते रहे हैं, खासकर सी में; और, सी में फ़ाइल और वैश्विक स्कोप(scope), और, C ++ में आने के बाद, ये मौजूद हैं और इसके अलावा हमारे पास क्लास(class) स्कोप(scope) और नेमस्पेस स्कोप(scope) है, जिस पर हमने अभी चर्चा की है।
 जैसा कि आप नोट कर सकते हैं कि स्कोप्स(scopes) का नाम या अनाम हो सकता है; क्लास स्कोप(class scope) की तरह हमेशा एक नाम होना चाहिए।
 नेमस्पेस(namespace) स्कोप(scope) आमतौर पर एक नाम होगा, लेकिन अनाम भी हो सकता है।
 ग्लोबल स्कोप (global scope) का कोई नाम नहीं है, लेकिन इस स्कोप रिज़ॉल्यूशन ऑपरेटर(scope resolution operator) द्वारा पहचाना जा सकता है।
 और ये स्कोप, जैसे कि अभिव्यक्ति, ब्लॉक फ़ंक्शन(block function) और फ़ाइल स्कोप(file scope), कोई भी नाम नहीं है जो वे अनाम हैं।
 और भी, स्कोप्स को नेस्ट किया जा सकता है, जैसे ब्लॉक स्कोप(block scope), क्लास स्कोप(class scope), नेमस्पेस स्कोप(namespace scope); वे नेस्टेड हो सकते हैं।
 लेकिन, कुछ स्कोप हैं जैसे फंक्शन स्कोप(function scope) या एक्सप्रेशन स्कोप(expression scope), उन्हें नेस्टेड नहीं किया जा सकता है।
 लेकिन उनमें से कुछ में अन्य स्कोप हो सकते हैं, लेकिन स्वयं नहीं हो सकते।
 तो, यह केवल संक्षेप में प्रस्तुत करना है क्योंकि यह बहुत महत्वपूर्ण है, विशेष रूप से शाब्दिक दायरे को जानते हैं, क्योंकि C ++ एक दृढ़ता से लेक्सिकल(lexical) स्कोप भाषा है।
 इसमें डायनेमिक स्कूपिंग(dynamic scoping) नहीं है; अर्थात्, इसमें निष्पादन निर्भर नाम बाइंडिंग नहीं है।
 यह एक पूरा नाम बाइंडिंग है, यह वह है जो इसे संबद्ध करता है, यह एक चर नाम के साथ मेमोरी को कैसे जोड़ता है यह पूरी तरह से लेक्सिकल(lexical) स्कोप पर निर्भर है, पूरी तरह से स्थैतिक समय पर निर्भर है।
 इसलिए, यह बहुत महत्वपूर्ण है कि चर नामों को निर्दिष्ट करने और उनकी दृश्यता और पहुंच को सीमित करने के इन सभी अलग-अलग विकल्पों में से, जो सही डिजाइन की स्थिति में सही है और इसका उपयोग करें।
 और, नेमस्पेस(namespace) केवल लेक्सिकल(lexical) स्कोप्स(scopes) की किटी(kitty) का विस्तार करने में मदद करता है और विशेष रूप से, आपके कोड(code) को व्यवस्थित करने के लिए एक शक्तिशाली उपकरण है और विशेष रूप से लिब्ररिएस(libraries) तक पहुँचने और आपकी लाइब्रेरी को आपके लिब्ररिएस(libraries) के प्रतीकों से अन्य तीसरे पक्ष के लिब्ररिएस(libraries) और इतने पर प्रतीकों से अलग करता है।
 उदाहरण के लिए, यदि आप एक लाइब्रेरी विकसित कर रहे हैं, जिसे आप दूसरों के साथ साझा करना चाहते हैं, तो यह हमेशा एक अच्छा विचार है कि आप उस संपूर्ण चीज़ को एक सार्थक नाम स्थान का नाम दें और उस नेमस्पेस(namespace) के अंदर उस संपूर्ण विकास को डालें, जैसे कि मानक लाइब्रेरी std का उपयोग कर रहा है।
 और फिर इसे उपयोगकर्ता को दें, ताकि यह संभावना न रहे कि, आपने अपनी लाइब्रेरी में कुछ फ़ंक्शन(function) नाम या वर्ग नामों का उपयोग किया है, जिसे उपयोगकर्ता भी उपयोग करना चाहता है, लेकिन ऐसा करने में सक्षम नहीं है।
 इसलिए, यह नेमस्पेसस(namespaces) के बारे में है और हम यहां बंद हो जाएंगे।