पहले से ही उचित जवाब के बहुत सारे। मैं एक सादृश्य के साथ चिपकेगा जो कुछ पाठकों की मदद कर सकता है। जब आप जिस प्रोग्राम को चलाना चाहते हैं, उसके लिए अपना रास्ता खोजते ::
हुए फाइलसिस्टम डायरेक्टरी सेपरेटर ' /
' की तरह काम करता है । विचार करें:
/path/to/executable
यह बहुत स्पष्ट है - फाइलसिस्टम के पेड़ में उस सटीक स्थान पर केवल एक निष्पादन योग्य, इस विनिर्देश से मेल खा सकता है, प्रभाव के बावजूद। इसी तरह ...
::std::cout
... सी ++ नामस्थान "पेड़" में समान रूप से स्पष्ट है।
इस तरह के निरपेक्ष रास्तों के विपरीत, आप अपने मौजूदा निर्देशिका या अपने वातावरण चर में किसी भी तत्व के तहत सापेक्ष रास्तों को हल करने के लिए अच्छे UNIX गोले (जैसे zsh ) को कॉन्फ़िगर कर सकते हैं , इसलिए यदि , और आप "में" थे , तो ...PATH
PATH=/usr/bin:/usr/local/bin
/tmp
X11/xterm
... ख़ुशी ख़ुशी मिलेगी /tmp/X11/xterm
अगर मिल जाए /usr/bin/X11/xterm
, वरना /usr/local/bin/X11/xterm
। इसी तरह, कहते हैं कि आप एक नामस्थान में थे X
, और एक " using namespace Y
प्रभाव" था, तब ...
std::cout
... में से किसी में पाया जा सकता है ::X::std::cout
, ::std::cout
, ::Y::std::cout
, और होने के कारण अन्य स्थानों तर्क पर निर्भर देखने (ADL, उर्फ कोएनिग देखने)। तो, केवल ::std::cout
वास्तव में स्पष्ट है कि आप किस वस्तु का अर्थ रखते हैं, लेकिन सौभाग्य से उनके दाहिने दिमाग में कोई भी कभी भी अपनी खुद की कक्षा / संरचना या नाम स्थान नहीं बनाएगा std
, और न ही " cout
" नामक कुछ भी , इसलिए केवल अभ्यास का उपयोग std::cout
करना ठीक है।
उल्लेखनीय अंतर :
1) गोले ऑर्डरिंग का उपयोग करके पहले मैच का उपयोग करते हैं PATH
, जबकि सी ++ एक अस्पष्ट त्रुटि देता है जब आप अस्पष्ट हो।
2) C ++ में, किसी भी प्रमुख गुंजाइश बिना नाम वर्तमान नाम स्थान में, मिलान किया जा सकता है, जबकि अधिकांश यूनिक्स के गोले केवल कि यदि आप रखूँ .
में PATH
।
3) C ++ हमेशा ग्लोबल नेमस्पेस खोजता है (जैसे /
आपके होने का अनुमान हैPATH
)।
नाम स्थान और प्रतीकों के गवाह पर सामान्य चर्चा
निरपेक्ष ::abc::def::...
"रास्तों" का उपयोग करना कभी-कभी आपके द्वारा उपयोग किए जा रहे किसी भी अन्य नामस्थान से आपको अलग करने के लिए उपयोगी हो सकता है, लेकिन वास्तव में आपके पुस्तकालय के ग्राहक कोड का उपयोग करने वाली सामग्री या अन्य पुस्तकालयों पर भी नियंत्रण नहीं होता है। दूसरी ओर, यह आपको प्रतीक के मौजूदा "निरपेक्ष" स्थान पर और अधिक मजबूती से जोड़े देता है, और आपको नामस्थानों में अंतर्निहित मिलान के फायदे याद आते हैं: कम युग्मन, नामस्थानों के बीच कोड की आसान गतिशीलता, और अधिक संक्षिप्त, पठनीय स्रोत कोड ।
कई चीजों के साथ, यह एक संतुलन कार्य है। के तहत पहचानकर्ता के सी ++ स्टैंडर्ड कहते हैं बहुत सारे std::
है कि कम "अद्वितीय" से कर रहे हैं cout
, कि प्रोग्रामर पूरी तरह से अलग कुछ उनके कोड में के लिए उपयोग कर सकते हैं (उदाहरण के लिए merge
, includes
, fill
, generate
, exchange
, queue
, toupper
, max
)। दो असंबंधित गैर-मानक पुस्तकालयों में समान पहचानकर्ताओं का उपयोग करने की अधिक संभावना है क्योंकि लेखक आमतौर पर एक-दूसरे के कम-या-जागरूक होते हैं। और पुस्तकालय - C ++ मानक पुस्तकालय सहित - समय के साथ अपने प्रतीकों को बदलते हैं। यह सब संभावित रूप से पुराने कोड को पुन: स्थापित करते समय अस्पष्टता पैदा करता है, खासकर जब एस का भारी उपयोग किया गया हो using namespace
: इस अंतरिक्ष में आप जो सबसे बुरा काम कर सकते हैं वह है अनुमतिusing namespace
हेडर के स्कोप से बचने के लिए हेडर में, जैसे कि एक बड़ी मात्रा में प्रत्यक्ष और अप्रत्यक्ष ग्राहक कोड अपने स्वयं के निर्णय लेने में असमर्थ हैं कि किस नाम स्थान का उपयोग करें और अस्पष्टता कैसे प्रबंधित करें।
इसलिए, ::
C ++ प्रोग्रामर के टूलबॉक्स में एक अग्रणी एक उपकरण है जो एक ज्ञात क्लैश को सक्रिय रूप से विभाजित करता है, और / या भविष्य की अस्पष्टता की संभावना को समाप्त करता है ...।
::
अर्थ वैश्विक / अनाम नामस्थान से चर का संदर्भ है।