Search

1.3a — cout, cin, endl, std namespace और using statements पर एक नज़र

std::cout

जैसा की पिछले sections में बताया गया, std::cout (जो iostream library का हिस्सा है) का इस्तेमाल screen पर text output करने के लिए किया जाता है । फिर से याद दिलाने के लिए ये रहा हमारा Hello world program:

एक ही line में एक से अधिक चीजें print करने के लिए output operator (<<) का इस्तेमाल एक से ज्यादा बार किया जा सकता है । उदाहरण के लिए:

ये program निम्नलिखित output देगा:

x is equal to: 4

आपको क्या लगता है, नीचे दिया गया program क्या print करेगा ?

आपको Result चौंकाने वाला लग सकता है । ये program निम्नलिखित output देगा:

Hi!My name is Alex.

std::endl

यदि हमे एक से ज्यादा lines print करना है, हम std::endl की मदद से ये कर सकते हैं । जब std::endl का प्रयोग std::cout के साथ किया जाता है, ये screen पर एक new line character डाल देता है (अर्थात cursor को अगले line पर ले जाता है) ।

उदाहरण के लिए:

ये code print करेगा:

Hi!
My name is Alex.

std::cin

std::cin std::cout का बिलकुल opposite (उल्टा) है -- जहां std::cout output operator (<<) के द्वारा भेजे गए data को console पर print करता है, वहीँ std::cin input operator (>>) के द्वारा console में user से input लेता है । आप variables से परिचित हो चुके हैं, इसलिए अब हम std::cin का प्रयोग user से input लेकर किसी variable में store करना सीखेंगे ।

इस program को खुद से compile और run करने की कोशिश कीजिये । जब आप इस program को run करोगे, सबसे पहले print होगा: “Enter a number: ” और फिर ये आपके input का इंतज़ार करेगा । जब आप कोई number type कर enter key press करोगे तो ये print करेगा: “You entered ” और इसके बाद वो number जो आपने input किया था ।

उदाहरण के लिए मान लेते हैं आपने 4 enter किया:

Enter a number: 4
You entered 4

ये user से input लेने का बहुत आसान तरीका है, और इसका प्रयोग आने वाले बहुत सारे examples में किया जाने वाला है ।

यदि आपके number enter करने के बाद screen तुरंत बंद हो जाता है तो कृपया 0.7 — C++ में आने वालीं कुछ सामान्य परेशानियाँ में दिए गये solutions पर एक नज़र डालिए ।

(एक मजेदार side note, यदि आप कोई बहुत बड़ा number enter करोगे तो program के results आपको झटका दे सकते हैं । इसे एक बार कर के देखें! ऐसा इसलिए होता है क्यूंकि x एक निश्चित सीमा तक ही numbers को store कर सकता है । इसके बाद, ये “overflow” कर जाता है । आगे आने वाले section में हम overflow पर चर्चा करेंगे ।)

std::cin, std::cout, << और >>

नये programmers अकसर std::cin, std::cout, << और >> को एक ही समझ बैठते हैं । इन्हें याद रखने का एक आसान तरीका नीचे दिया गया है:

  • std::cin और std::cout हमेसा किसी statement की बायीं ओर होते हैं
  • std::cout का इस्तेमाल value का output देने के लिए होता है (cout = output)
  • std::cin का इस्तेमाल यूजर से input value लेने के लिए होता है (cin = input)
  • << को हमेसा std::cout के साथ इस्तेमाल किया जाता है, और ध्यान दीजिये की इस symbol का direction r-value से console की तरफ जाता हुआ दिखाई देता है । std::cout << 4 value 4 को console की तरफ भेजता है
  • >> को हमेसा std::cin के साथ इस्तेमाल किया जाता है, और इसका direction console से variable की तरफ जाता हुआ दिखाई पड़ता है । std::cin >> x दिए गये value को console से x के तरफ भेजता है

std namespace

Standard library में हर चीज़ एक विशेष container के अंदर रहता है (जिसे namespace कहते हैं) जिसका नाम std (“standard” का छोटा रूप) है ।

इससे ये समझा जा सकता है की std::cout का नाम असल में “std::cout” नही है । ये सिर्फ “cout” है और “std”, उस namespace का नाम है जिसके अंदर cout रहता है ।

हम आने वाले एक section में namespaces के बारे में और अधिक चर्चा करेंगे और साथ ही ये भी जानेंगे की हम खुद अपना namespace कैसे बना सकते हैं । अभी के लिए, namespaces के बारे में बस इतना जानना काफी है की जब भी हम किसी ऐसी चीज़ का इस्तेमाल करते हैं जो standard library का हिस्सा है (जैसे की cout), हमे compiler को बताना पड़ता है की वो std namespace के अन्दर है ।

Explicit namespace qualifier std::

“std::” prefix का इस्तेमाल कर हम compiler को ये बता सकते हैं की cout std namespace के अन्दर है:

ये cout को अपने program में इस्तेमाल करने का सबसे सुरक्षित तरीका है, क्यूंकि compiler को यहाँ बिना किसी दिक्कत के पता लग जाता है की cout कहाँ स्थित है (क्यूंकि हमने std:: को ठीक cout के पहले लिखा है, ये आसानी से बताया जा सकता है की cout और std:: के बीच कुछ सम्बन्ध है) ।

लेकिन यदि आप standard library का बहुत ज्यादा उपयोग करने लगे, तो बार-बार standard library के किसी object के आगे “std::” type करना program को पढने/समझने में भी मुश्किल बना देता है और ये काम थकाऊ भी है । C++ चीजों को आसान बनाने के लिए दो और तरीके प्रदान करता है । ये दोनों तरीके भी compiler को यही बताने के काम आते हैं की कोई object standard library का हिस्सा है या नहीं ।

using declaration

चीजों को आसान बनाने का एक तरीका using declaration statement है । यहाँ हमारा Hello world program 5वीं line पर एक using declaration के साथ फिर से लिखा जा रहा है:

यहाँ using declaration “using std::cout;” compiler को ये बता रहा है की हम std namespace से object cout का इस्तेमाल करने वाले हैं । इसलिए अब जब भी compiler को “cout” मिलता है, ये समझ लेता है की हमारा मतलब std::cout है । इसी के चलते line 6 में हम “std::cout” के बजाय केवल “cout” लिख सकते हैं । हमे कोई compiler error नहीं मिलेगा ।

यहाँ इस छोटे से example में using declaration का फायदा नहीं दिखेगा, लेकिन यदि आप किसी function में cout (या cin या endl) का बहुत ज्यादा इस्तेमाल करने लगोगे, तो ये आपके codes को पढने में काफी आसान बना सकता है ।

यद्दपि ये “std::” prefix के जितना साफ़ तरीके से चीजों को नहीं समझाता, इसे साधारणतः उपयोग के लिए सही और सुरक्षित माना जाता है ।

using directive

चीजों को और ज्यादा आसान बनाने के लिए using directive statements का प्रयोग किया जाता है । 5वें line पे एक using directive के साथ नीचे हमारा Hello world program फिर से लिखा गया है:

Using directive “using namespace std;” compiler को बतलाता है की हम std namespace में रहने वाले हर चीज़ का इस्तेमाल करने वाले है, इसलिए जब compiler को कोई ऐसा नाम मिल जाता है जिसे compiler नहीं पहचान पाता, तो इस नाम के बारे में जानने के लिए compiler std namespace को check करेगा । इसलिए compiler को जब program में “cout” दिख जाता है (जिसे ये नहीं पहचानता), ये std namespace में जाकर cout को वहाँ तलाश करेगा ।

using directive का उपयोग करना एक अच्छा solution है या नहीं, ये अभी भी programmers के बीच बहस का एक मुद्दा है । क्यूंकि using directives किसी namespace में स्थित सारे नामों को खींच लाते हैं, किसी program में आपके objects (जैसे की variables, functions, classes आदि) को दिए गये नाम इन नामों (namespace के objects से मिलते नाम) से टकरा सकते हैं । इस तरह की समस्या को एक naming collision कहा जाता है । लेकिन इन दिक्कतों के आने की संभावना बहुत कम होती है ।

Functions के अन्दर या बाहर Using declarations और directives

यदि एक using declaration या directive को function के अन्दर रखा गया है, तो namespace में स्थित नामों को केवल उसी function के अन्दर directly access किया जा सकता है (बिना std:: prefix के) । ये naming collisions होने की संभावना को उसी function तक सीमित रखता है । लेकिन यदि किसी using declaration या directive का इस्तेमाल function के बाहर किया जा रहा है, तो namespace में स्थित नाम file में कहीं से भी directly access किये जा सकते हैं! इस प्रकार naming collisions होने की संभावना काफी हद तक बढ़ जाती है ।

Naming collision का एक example

चलिए एक उदाहरण पर नज़र डालते हैं जहाँ एक using directive naming collision का कारण बनती है:

ऊपर दिए गये example में, compiler ये समझ नहीं पायेगा की cout से हमारा मतलब क्या है, std::cout या वो cout function जो हमने define किया है । इस परिस्थिति में, compiler एक “ambiguous symbol” error के साथ compile करने में असफल हो जायेगा । भले ही ये उदाहरण काफी छोटा है, यदि हम std::cout का स्पष्ट रूप में इस्तेमाल कुछ इस तरह से करते:

या using directive की जगह using declaration का इस्तेमाल करते:

तो हमारे program को compile करने में कोई दिक्कत नहीं होती ।

बहुत से लोग “using directives” का इस्तेमाल करना इसी कारण से पसंद नही करते । कुछ लोगों के अनुसार ये सही है जब तक इसे केवल और केवल किसी function के अन्दर रखा जाये (जो naming collision की संभावना को उस function तक में ही सीमित रखता है) ।

using statements पर एक नोट

इस page से आगे के examples में, हमलोग ज्यादातर सबसे स्पष्ट रूप से ही standard library के objects का इस्तेमाल करेंगे (std:: prefix लगाकर), लेकिन फिर भी कुछ जगहों पर जहां code को अच्छी तरह पढ़ पाना ज्यादा ज़रूरी है, हम functions के अन्दर “using directives” का प्रयोग करेंगे । ये पूरी तरह से आप पर निर्भर है की आप programming करते वक़्त “using statements” का इस्तेमाल करना चाहोगे या नहीं ।

जो भी हो लेकिन “using statements” का इस्तेमाल functions के बाहर करने से बचना चाहिए ।

Rule: Function body के बाहर using statements का इस्तेमाल ना करें

1.4 -- Functions और return values पर एक नज़र
Index
1.3 -- Variables, initialization, और assignment पर एक नज़र

Leave a Comment

Put C++ code inside [code][/code] tags to use the syntax highlighter