Shift Operators Overloading

Shift Operators Overloading: अब हम ये जानेंगे कि Extraction व Insertion Operators को किस प्रकार से Overload किया जा सकता है। ये C++ का एक बहुत ही Powerful Feature है। Overloading हमें ये सुविधा देता है कि हम विभिन्न I/O Operations को User Defined Data Type के साथ भी समान प्रकार से Use कर सकते हैं, जिस प्रकार से किसी Basic Data Type के साथ Use करते हैं। उदाहरण के लिए यदि हम employee या person Class के Object को निम्नानुसार Syntax द्वारा Output पर Display करवाना चाहें, तो Overloading द्वारा हम ये सुविधा प्राप्त कर सकते हैं।

cout << empObject;

ठीक इसी तरह से हम Basic Data Type के Variables को भी निम्नानुसार ही Screen पर Print करवाते हैं:

cout << intVariable

किसी Class के Objects के साथ में Extraction Insertion Operator को समान प्रकार से Use करने के लिए हमें इन Operators को Overload करना जरूरी होता है। हम इन Operators को Overload करके Files के साथ भी समान प्रकार से Use कर सकते हैं।

Overloading for cout and cin

अगले Program में हमने English Class के लिए cout व cin Operator को Overload किया है। Program निम्नानुसार है:

	// englio.cpp
	// overloaded << and >> operators
	#include <iostream.h>

	class English                                 				// English class
	{
		private:
			int feet;
			float inches;

		public:
			English()                            			// constructor (no args)
			{ feet = 0; inches = 0.0; }
			English(int ft, float in)            			// constructor (two args)
			{ feet = ft; inches = in; }

			friend istream& operator >> (istream& s, English& d);
			friend ostream& operator << (ostream& s, const English& d);
	};

	istream& operator >> (istream& s, English& d)		// get distance
	{                                        		// from user
		cout << "\nEnter feet: ";  s >> d.feet;   	// using
		cout << "Enter inches: ";  s >> d.inches;	// overloaded
		return s;                             		// >> operator
	}

	ostream& operator << (ostream& s, const English& d)	// display
	{                                               	// distance
		s << d.feet << "\'-" << d.inches << '\"';	// using
		return s;                                     	// overloaded
	}                                                 	// << operator

	void main()
	{
		English dist1, dist2;               		// define English objects
		cout << "\nEnter two English values:";
		cin >> dist1 >> dist2;				// get values from user
		English dist3(11, 6.25);        		// define, initialize dist3
								// display distances
		cout << "\ndist1 = " << dist1 << "\ndist2 = " << dist2;
		cout << "\ndist3 = " << dist3;
	}

ये Program User से दो Distance Values के लिए Request करता है और फिर इस Value व एक और Value जो कि Program द्वारा स्वयं Initialize की जाती है, Output में Print कर देता है। इस Program का Output निम्नानुसार होता है:

Enter feet: 10
Enter inches: 3.5

Enter feet: 12
Enter inches: 6

dist1 = 10'-3.5"
dist2 = 12'-6"
dist3 = 11'-6.25"

ध्‍यान दें कि इस Program में main() function कितना सरल व Natural तरीके से English Objects को Handle कर रहा है ठीक उसी तरह से जिस तरह से किसी Basic प्रकार के Data Type के Object या Variable Use किया जाता है। जैसे:

cin >> dist1 >> dist2;

और

cout << “\ndist1=” << dist1 << “\ndist2=” << dist2;

operator<<() व operator>>() functions English Class के लिए friends होने जरूरी होते हैं, क्योंकि istream व ostream Objects Operator के Left Side में लिखे जाते हैं। friends के बारे में हमने अध्‍याय 9 में विस्तार से बताया है। ये Functions istream (for >>) व ostream (for <<) लिए By Reference एक Object Return करते हैं। By Reference Return होने वाली ये Return Values हमें Chaining की सुविधा  प्रदान करती हैं ताकि हम एक ही Statement में एक से अधिक को Input या Output Object में भेज सकें।

operator Function दो Passed By Reference Arguments लेते हैं। पहला Argument istream Class (for >>; जो कि अक्सर cin होता है।) या ostream Class (for <<; जो कि अक्सर cout होता है।) एक Object होता है। दूसरा Argument वह Object होता है जिसे Display करना होता है, जो कि हमारे उदाहरण में English Class का एक Object है। तथ्; ये है कि English Class के Objects को By Reference Function में Pass किया जाता है, जिसकी वजह से इन्हें Function द्वारा Modify किया जा सकता है।

>> Operator उस Specify किए गए Stream से Input लेता है जिसे पहले Argument के रूप में Function में दिया जाता है और इसे उस Object के Member Data में Copy कर देता है जिसे दूसरे Argument में Specify किया गया है। << Operator दूसरे Argument में Specify किए गए Object के Data को Copy करता है और उसे उस Stream Object में भेज देता है जिसे पहले Argument द्वारा Specify किया गया है।

इसी तरीके को अपनाते हुए हम अन्‍य Classes के Objects के लिए भी Insertion व Extraction Operators को Overload कर सकते हैं। हमने operator() Function के दूसरे Argument के साथ const Keyword का प्रयोग इसलिए किया है, ताकि Function इस दूसरे Object के Data को किसी भी प्रकार से Modify ना कर सके।

Overloading for Files

अगला उदाहरण ये Show करता है कि हम English Class के लिए किस प्रकार से << व >> Operators को Overload कर सकते हैं, ताकि इन्हें File I/O Operations व cin तथा cout दोनों के लिए Use किया जा सके।

	// englio2.cpp
	// overloaded << and >> operators work with files
	#include <fstream.h>

	class English                         		// English English class
	{
		private:
			int feet;
			float inches;

		public:
			English()                      	// constructor (no args)
			{ feet = 0; inches = 0.0; }
			English(int ft, float in)      	// constructor (two args)
			{ feet = ft; inches = in; }

			friend istream& operator >> (istream& s, English& d);
			friend ostream& operator << (ostream& s, const English& d);
	};

	istream& operator >> (istream& s, English& d)	// get distance
	{                                         	// from file or
		char dummy;  				// for ('), (-), and (")  
		s >> d.feet >> dummy >> dummy >> d.inches >> dummy;
		return s;                                  	// overloaded
	}                                         		// >> operator

	ostream& operator << (ostream& s, const English& d) 	// send
	{                                         		// to file or
		s << d.feet << "\'-" << d.inches << '\"';   	// screen with
		return s;                                 	// overloaded
	}                                          		// << operator

	void main()
	{
		char ch;
		English dist1;

		ofstream ofile;                   	// create and open
		ofile.open("DIST.DAT");             	// output stream

		do
		{
			cout << "\nEnter English: ";
			cin >> dist1;                	// get distance from user

			ofile << dist1;               	// write it to output str
			cout << "Do another (y/n)? ";
			cin >> ch;
		}
		while(ch != 'n');
			ofile.close();                  // close output stream

		ifstream ifile;                     	// create and open
		ifile.open("DIST.DAT");            	// input stream

		cout << "\nContents of disk file is:";

		while(1)
		{
			ifile >> dist1;                 // read dist from stream
			if( ifile.eof() )              	// quit on EOF
			break;
			cout << "\nDistance = " << dist1;  // display distance
		}
	}

इस Program में हमने Operators को Overload करने के लिए कम से कम परिवर्तन किए हैं। इसमें >> Operator Input के लिए Prompt नहीं करता है क्योंकि इसे File से Data प्राप्त करने के लिए Prompt करने की जरूरत नहीं है। जब Program Keyboard से Input प्राप्त करता है, तब Program ये मानता है कि User को पता है कि Feet व Inches Values को किस प्रकार से विभिन्न Punctuation Marks के साथ Input करता है। (जैसे Feet के लिए एक Integer Value और एक Quote एक Hyphen और Inches के लिए एक Float प्रकार की Value और एक Double Quote 10’-2” ) << Operator को Unchanged रखा गया है।

Program User से Input के लिए कहता है, और Values को प्राप्त करते ही उसे File में Write कर देता है। जब User Input करना बन्द करता है, तब Program File से विभिन्न Values को Read करता है और Output में Display करता है। इस Program से User का Interaction कुछ निम्नानुसार होता है:

Enter Distance: 3'-4.5"
Do another (y/n)? y

Enter Distance: 7'-11.25"
Do another (y/n)? y

Enter Distance: 11'-6"
Do another (y/n)? n

Contents of disk file is:
Distance = 3'-4.5"
Distance = 7'-11.25"
Distance = 11'-6"

File में Input किया गया Distance Character By Character Store होता है। इस उदाहरण में File के Contents निम्नानुसार होते हैं:

// Data in File

        3′-4.5″7′-11.25″11′-6″

यदि User सही Punctuation के साथ Data Input नहीं करता है, तो Data File में ठीक से Write नहीं होगा और File << Operator द्वारा Readable नहीं हो पासगी। एक Real या Professional Program में Input पर Error Checking करना जरूरी होता है।

Overloading for Binary I/O

पिछले उदाहरण में हमने Formatted I/O के लिए operator<<() व operator>> को Overload करना सीखा। क्या इन Operators को Binary I/O के लिए भी Overload किया जा सकता है। निश्चित रूप से किया जा सकता है और जैसाकि हमने पहले भी कहा है कि ऐसा करने पर Data को Store करना ज्यादा Efficient हो जाता है, खास तौर पर तब जब Object का ज्यादातर Data Numerical हो।

अगले उदाहरण में हमने Show किया है कि किस प्रकार से हम person Object के Data को Disk File पर Binary Format में Store कर सकते हैं। Binary Format का मतलब होता है कि जिस Format में Data Memory में Store होते हैं, उसी Format में Data को Disk File पर Store करना। person Class में 40 Bytes Name Field के लिए और दो Bytes एक Integer Age Store करने के लिए Use हो रहा है। person Class के Member Functions इस Data को Keyboard से Accept करने और Screen पर Display करने के लिए Use किए जाते हैं।

इस Program में read() व write() Functions को Use करके << व >> Operators को Overload किया गया है ताकि File में Data को Write व File से Data को Read किया जा सके।

	// persio.cpp
	// overloading << and >> for person objects
	// storing binary data in file
	#include <fstream.h>                	// for file streams

	class person                          	// class of persons
	{
		protected:
			enum {SIZE=40};         // size of name buffer
			char name[SIZE];        // person's name
			int age;                // person's age

		public:
			void getData()          // get data from keyboard
			{
				cout << "\n   Enter name: "; cin.getline(name, SIZE);
				cout << "   Enter age: ";  cin >> age;
				cin.ignore(10, '\n');
			}

			void putData()          // display data on screen
			{
				cout << "\n   Name = " << name;
				cout << "\n   Age = " << age;
			}

			friend istream& operator >> (istream& s, person& d);
			friend ostream& operator << (ostream& s, person& d);

			void persin(istream& s)      	// read file into ourself
			{
				s.read( (char*)this, sizeof(*this) );
			}

			void persout(ostream& s)        // write our data to file
			{
				s.write( (char*)this, sizeof(*this) );
			}
	};

	// get data from disk
	istream& operator >> (istream& s, person& d)
	{
		d.persin(s);
		return s;
	}

	// write data to disk
	ostream& operator << (ostream& s, person& d)
	{
		d.persout(s);
		return s;
	}

	void main(void)
	{                                		// create 4 persons
		person pers1, pers2, pers3, pers4;
		cout << "\nPerson 1";
		pers1.getData();                     	// get data for pers1
		cout << "\nPerson 2";
		pers2.getData();                   	// get data for pers2

		// create output stream
		ofstream outfile("PERSON.DAT", ios::binary);
		outfile << pers1 << pers2	// write to file
		outfile.close();                     	// create input stream
	
		ifstream infile("PERSON.DAT", ios::binary);
		infile >> pers3 >> pers4;          	// read from file into
		cout << "\nPerson 3";               	// pers3 and pers4
		pers3.putData();                  	// display new objects
		cout << "\nPerson 4";		
		pers4.putData();
	}

जैसाकि हमने पहले भी कहा कि Overloaded << व >> operator Functions का Class के लिए Friend Function होना जरूरी होता है क्योंकि stream Object person Object के अलावा एक Left – Hand Argument की तरह Use होता है। क्योंकि हम Binary Format Use कर रहे हैं, इसलिए person Object के Data को Memory से Directly Access करना काफी Convenient होता है, जिसे this Pointer द्वारा Handle किया जा रहा होता है।

लेकिन this Pointer Friend Functions में Accessible नहीं होते हैं। इसलिए हम Overloaded << व >> Operator Function में हम Friend Functions को Call करते हैं, जो कि person Class के Member Functions हैं और ये ही Reading व Writing का Actual काम करते हैं।

Main Function में Program User से दो Objects के Data प्राप्त करता है, उन्हें Disk पर Write करता है, फिर से Disk से दो अलग person Objects में Read करता है और उन Objects के Contents को Display करता है। इस Program से User निम्नानुसार Interaction करता है:

Person 1
   Enter name: George Harrison
   Enter age: 33
Person 2
   Enter name: Emily Dickinson
   Enter age: 25
Person 3
   Name = George Harrison
   Age = 33
Person 4
   Name = Emily Dickenson
   Age = 25

जैसाकि हमने पहले भी देखा है कि Overloaded Operators की Chaining की जा सकती है ताकि एक ही Single Statement द्वारा एक से अधिक person Objects को Disk पर Write किया जा सके। (Shift Operators Overloading) जैसे:

outfile << pers1 << pers2;

और एक ही Single Statement द्वारा Disk से एक से अधिक person Objects के Data को निम्नानुसार Read किया जा सकता है:

infile >> pers3 >> pers5

Size of Derived Objects
Memory as Stream Object and Buffer

CPP Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C++ Programming Language in Hindi | Page: 666 | Format: PDF

BUY NOW GET DEMO REVIEWS