 اسلام علیکم، today's لیکچن number 37 of CS201 Introduction to Programming ہم نے کافی topic سپشتی دفعہ کبر کیے تھے regarding the formatting of output and input اور اس کے اندر آپ نے دیکھا کہ جی بہت سارے طریقے ہیں جن کے ساتھ ہم C in اور C out کے ساتھ input اور output کی formatting کنٹرول کر سکتے ہیں کئی alternative تھے، تھوڑا سا کنفیوزنگ ہو جاتا ہے کہ جی ایک ایک کام کے لیے تین تین چیزیں ہیں لیکن all you need to do is select a method and then stick with it اور یہ یاد رکھیں کہ جی کتاب اور باقی reference material تو ہمیشہ آپ کے پاس ہوتا ہے جب بھی ہم ان چیزوں کی بات کر رہے تھے نئی languages کی نئے tools کی وہاں پہ I would always recommend one thing the important thing to know is جی کیا چیز کی جا سکتی ہے کیسے کی جاتی ہے وہ ہمیشہ آپ کو reference material میں مل جاتی ہے so you know the exact syntax you can always look up in a book but what you need to know is کہ جی ایک two digit number جو ہے اس کو ہم seven space wide جگے کے اندر اس کو print کر سکتے ہیں and so on so there is a question mark in terms of کیا چیز آپ کو یاد رکھنی ہیں اور کیا چیز آپ کو پتا ہونی چاہیے I always recommend کیا آپ کو یہ پتا ہونا چاہیے کہ جی language کے ساتھ کیا کیا کچھ ہم کر سکتے ہیں exact syntax don't worry too much about it now obviously for the course you have to learn a few things you have to know کہ جی line can پر semi colon ہولا چاہیے but when you come to new languages if your concepts are sound آپ کو پتا ہونا چاہے کہ جی language میں ایک decision construct ہوتا ہے so if else ہم استعمال کرتے تھے یہاں پہ شہد کچھ اور طریقہ ہو لیکن یہ پتا ہوں کہ the decision construct ہے تو you can always look it up same applies to loops same applies to other idiosyncrasies of every language so languages do the same things but with the different syntax the important thing to understand or remember کیا چیز کی جا سکتی ہے کیسے والا حصہ reference میں مل جاتا ہے آج جس topic ہم طرف چلے ہیں وہ ہے of operator overloading ہم نے already کیا ہوا ہے کافی اس کے اوپر بات کی تھی لیکن آج ہم input اور output کے حوالے سے بات کرنے لگے ہیں what we want to do is look at operator overloading the stream insertion and extraction operators جن جن کو ہم دبل گریٹر than دبل less than کہتے رہے ہیں why do we want to do this تھوڑی سی justification ہونی چاہیے now the idea is کیجی as with other operator overloading ہم نے کسی let's say complex class لی تھی اور اس کے ساتھ کہا تھا کیجی plus ہم operator overload کر دیتے ہیں مقصد کرنے کا یہ تھا کہ جب ہم complex numbers کے ساتھ ڈیل کر رہے ہوں تو ان کی arithmetic اسی طرح نظر آئے جیسے ہماری native data ڈیٹر تیپس یعنی ڈیٹس کی یا ڈبل کی نظر آتی ہے so when we read a program and you know that z1 and z2 are two complex numbers تو کہیں پہ آپ نے z1 plus z2 کی expression دیکھی تو سمجھ بھی آ جاتی ہے دو complex numbers ہیں ان کو add کیا جا رہا ہے rather than use the ڈپورانہ c والا concept یہ جیک function call ہوگی complex add یا c add اور پھر اس کو دو parameters دیے جائیں گے so the idea is to make a program more readable and use things that we are used to یعنی اگر میں کوئی output کرنی ہے تو maybe output کوئی special ڈریکے سے ہوری ہو لیکن if i am using the stream insertion operator یعنی see out less than less than لکھ کے میں آگے کوئی object لکھ دیتا ہوں تو پرنے والے کو ایک دن پتا چاہتا ہے کہ یہ output ہو رہی ہے now the same thing that you did with other operators we will be talking about here لیکن جو چیز یاد رکھنے والی ہے کہ یہ operator overloading میں ہم basically functions لکھ رہا ہوتے ہیں کوئی نئی چیز نہیں کر رہا ہوتے جب ہم functions لکھ رہا ہوتے ہیں تو again we have the ability or the facility to do anything we like ڈینی function کے اندر جو مرزی ہمارا دل کرے ہم لکھ سکتے ہیں لیکن جس طرح ہم نے plus minus multiply divide کے لیے بھی کیا تھا operator کا spirit جو ہے وہ maintain رکھنا چاہئے now when we have a stream insertion operator یعنی double less than جسے ہم normally ints وگیرہ کو output کرتے ہیں تو ہم چاہیں گے کہ اگر ہم اپنے objects یا اپنی classes کے لیے اس operator کو overload کریں تو یہ پھر بھی یہی کام کریں یعنی کہ output دکھائے now as i mentioned ڈینی ہمارے پاس ہم چاہیں تو اس کے اندر کسی class کے square route لے لیں if that is a function that is defined ڈینی اور کچھ بھی نہ کریں but that was against the spirit of the operator so we would like to maintain the spirit same applies to stream extraction operators جا اگر double greater than ڈین کیا ہم کرتے ہیں see in greater than greater than i جہاں پہ i was an integer so what we were doing was we were reading input normally from the keyboard and putting it into an integer variable now if we were to define a double greater than ڈینی a stream extraction operator for our own class we would want to be input کہی function perform کرے کوئی اور کام نہ کرنے لکھ پڑے so freedom is there but please maintain the spirit and write insertion operators and extraction operators the way they behave with other native data types now again we are actually revisiting the topic of operator overloading so most of this stuff is stuff that I have already spoken to you about nonetheless let's take a look at what is required جب بھی ہم کوئی operator overload کرنے جاتے ہیں تو پہلے دیکھنے آپ نے کہ وہ unary operator ہے کہ binary operator ہے اور یاد رکھیں کہ جی اس کو ہم چینج نہیں کر سکتے اگر کوئی binary operator ہے جیسے plus symbol ہے so a plus b لکھا جاتے ہیں اس میں دو operands ہوتے ہیں تو ہم اپنا operator overload کرتے وقت اس کا number of arguments چینج نہیں کر سکتے یعنی binary operator will remain binary تو اب اگر insertion اور extraction operators کو دیکھیں تو ہی ریالائس کہ جی ایک طرف c in یا c out object ہے یا i stream یعنی input stream یا o stream یا output stream کا ایک object ہوتا ہے اور operator کی دوسی طرف کوئی ڈیٹا ہوتا ہے int ہو سکتا ہے float ہو سکتا ہے یا ہمارا کسی class کا object ہو سکتا ہے دوسی چیز جو دیکھنے والی ہے وہ جی ہے کہ جناب operator وہ کچھ return کرے گا کی نہیں کرے گا یہی ہمیں مسئل آیا تھا plus minus کے ساتھ کہ جب ہم کوئی statement لکھتے ہیں something like a plus b plus c تو وہ کام کرتی ہے اگر abc integers ہیں that means اب اس کا order of evaluation ہم کو دیکھنا ہے کہ جی normally b plus c پہلے operate کرتا ہے اور کوئی چیز return کرتا ہے جو کہ پھر a plus that thing اپس میں interact کر سکتے ہیں so even the operators have some return values اب جب ہم یہ operator overload کرنے چلے ہیں input or output streams کے لیے اب میں stream کا word اس پاس دے استعمال کروں گا اب ہم نے تھوڑی سی اس کے اوپر discussion کر لی ہے اور یاد رہے کہ stream وہی ہے it's a pipe connecting some area inside the computer اگر ایک memory or disk or something with the outside world which may be the keyboard or the screen a printer or some other device so input or output streams جو ہیں ان کو ہم نے ان کے operators کو overload کرنا ہے ان کے insertion or extraction operators کو occasionally میں نے یہ بھی mention کیا ہے کہ یہ operators already overloaded ہیں دیکھیں already اگر see ان کے ساتھ آپ دیتے ہیں greater than greater than i جہاں پہ آئی جو ہے وہ integer ہے وہ کام کرتا ہے آئی کی جگہ پہ ہم x لکھ دیتے ہیں جو کہ ایک floating point number ہے تب بھی see ان کے ساتھ stream extraction operator کام کرتا ہے یعنی int کا کام اور ہے float کی input لینا اور طریقے سے لیتے ہیں اگر ہم character input کر رہے ہیں تو اس کا اور طریقہ ہے that means these operators are already overloaded now where are they overloaded i would suggest کہ آپ io stream.h جو file ہے اس کو آپ کھول کے دیکھیں اس کو change نہ کیجے گا you might cause some very strange behavior in your compiler but کم از کم اس کو کھول کے دیکھ سرود لیں اور وہاں پہ دیکھیں کہ جناب یہ operators کیس طرح سے overload ہوئے ویں ان کا syntax بھی آپ کو نظر آئے گا اور وہی syntax آج ہم کور کرنے جا رہے ہیں now that we are going to overload these operators let us take a look at کہ کن کن چیزوں کا ہمیں خیال رکھنا چاہیے پہلی چیز یہ کہ جو insertion اور extraction operators ہیں یہ binary operators ہیں ان میں دو objects ہیں جن کا اپس میں interaction ہونا ہے ایک object تو ہو گیا ہمارا see in یا see out یعنی i stream کا object یا o stream کا object اور دوسی طرف operator کے usually ہمارا اپنے class کا کوئی object ہوتا ہے why because native data types کیلئے تو you already overloaded ہیں so we don't need to worry about those now that this is defined it is binary the other part we need to worry about is کہ جی ان کو cascade کرنا ہے کہ نہیں کرنا cascade کرنے کا کیا مطلب ہے وہی جو میں نے بھی بات کی تھی کہ جی ہم a plus b plus c اگر لکھ سکتے ہیں یا پہلے ہم see in کے ساتھ ہم لکھتے ہیں see in greater than greater than i greater than greater than j and so on یعنی آپ ایک لائن میں ایک دو تین stream extraction functions کر سکتے ہیں یا see out کے ساتھ ایک دو تین stream insertion operations کر سکتے ہیں display کیلئے تو ہم اس چیز کا بھی خیال رکھیں گے کہ جی ان کو ہم cascadible بنانا چاہیں گے اب مطلب اس میں یہ کوئی لازمی چیزیں نہیں ہیں جو میں نے پہلے بات کی تھی کہ جناب because these are operators and we write them as functions we have freedom to do what we want but we want to maintain the spirit of the original operators now let us take a look at what happens when we try to overload an operator for a class what happens is کجی اب ایک طرف جو ہمارا stream operator آنا ہے see in یا see out اور دوسی طرف آنا ہے object of a class تو اس کو لکھنے کا طریقہ جو ہے وہ یہ ہے کہ جناب کلاس کے اندر ہمارے پاس کوئی set یا get functions اگر موجود ہیں جو کے public functions ہیں پھر تو یہ operators ان کو استعمال کر لیں گے for inputting and setting the values of an object or getting the object values internal private data members and outputting them on the other hand اگر ہم چاہیں کہ جو کلاس کے اندر والے private data members ہیں ان کی values directly get کر لی جائیں یا directly output کر لی جائیں تو کوئی mechanism ہے ہمارے پاس یہ کام accomplish کرنے کے لیے if you remember we had a facility called a friend function جنی ایک ایسا function جو کسی کلاس کا دوست ہے دوست وہ ہو سکتا ہے تو دوست کے ناتے اس کو access ہے to the private data members of a class or private functions now when we want to overload these operators we have to keep that in mind that we have two different ways of overloading remember ہماری ساری دسکشن ہماری اپنی بنای ہوئی classes او ان کے objects کے لیے بنای جا رہی ہے because we want to overload operators with respect to our class first point to understand is can these overloaded operators be member operators of these classes answer is no they can't be members can anyone tell me why do you think a member your operators ہیں نہیں ہو سکتے any member functions نہیں ہو سکتے class کے reason is actually quite straight forward دیکھیں جو ڈرائف کر رہا ہے نا اس operator کو وہ چیز ہے جو left-hand side پہ ہے left-hand side پہ ہمارا یا see in آتا ہے یا see out آتا ہے in other word extreme object آتا ہے so when we member data یا member functions کو استمال کرتے ہیں تو ہمارا ہوتا ہے object.data your object.function یہ ہمارا calling syntax ہوتا ہے لیے left side پہ object آرہا ہوتا ہے اس case میں left side پہ کوئی بہر کی چیز آ رہی ہے بہر کی چیز meaning stream so جب see in or see out بہر والے objects ہمارے object کے ساتھ interact کریں through this operator تو your operator ہے یہ member function نہیں ہو سکتا class کا اب اگر یہ member نہیں ہو سکتا تو پھر اس کو ہمیں friend بنانا پڑے گا again لازمی نہیں ہے جیسے میں نے ابھی ذکر کیا اگر ہم نے اپنی class لکھی ہی اس طریقے سے ہے کہ اس کے اندر set functions لگائے ہوئے ہیں کہ جی اگر ہمار پاس int i int j int k class کے internal data members ہیں اور اس کے لیے ہم نے set function بنائے ہوئے set i set j set k یہ نہیں function لکھا ہوئے جو کہ کوئی بھی value لے کے i کی value سیٹ کر دیتا ہے یا جی کی value سیٹ کر دیتا ہے تو پھر ہم اپنا stream extraction operator جو ہے جو see in کے ساتھ استعمال کرنا ہے اس میں ہم یہ set functions استعمال کر سکتے ہیں because normally these functions are in the public interface of the class یعنی بہر سے جو چیز نظر آ سکتی ہے same applies to the get operators یعنی اگر ہم ان کا data members کو display کرنا چاہتے ہیں تو عام طور پہ اگر ہم نے get functions لکھے ہوئے ہیں جو کہ class کے internal data members کو get کریں اور ہمیں available کر دیں ordinary variables تو ان کو ہم display کر سکتے ہیں تو ایک طریقہ تو یہ ہوگیا کہ آپ freestanding یعنی independent of any class بہر ایک function لکھیں which is an overloaded operator اور وہ operator جو ہے وہ بزاتے خود یا set یا get functions کو استعمال کر کلاس کے objects کے ساتھ interact کرے طریقہ تو ہے لیکن usually it is a little inconvenient ہوتا ہے اس کے لیے پھر ہم operator کو friend بنا دیتے ہیں اگر friend بنا دیں تو operator now has full access to the internal private data structure of the class and therefore we can manipulate things inside the class using these friend functions چونکہ ہم class کا friend بنا رہے ہیں یاد رکھیں جو ہماری class ہے ہم اس کا friend declare کر رہے ہیں iStream جو objects ہیں ان کو ہم کچھ نہیں کر سکتے ہیں ان کا friend train نہیں بنا رہے ہیں ہم اپنی class کا friend بنا رہے ہیں so what we do is normally جہاں پہ بھی آپ نے class define کی تو اس کے فورن بعد اس class کے friend functions جو ہیں وہ define کر دیتے ہیں ان کی friend functions کی declaration جوہاں وہ تو class کے اندر آئے گی لیکن ان کی definition class کی definition کے فورن بعد ہم دال دیتے ہیں تاکہ وہ نظر آجائے جس وہی human interface کے طور پہ جب ہم code دیکھ رہے ہیں تو نظر آجائے یہ class ہے یہ اس کے friend functions ہیں ایک اٹھے لکھے ہوئے now let's go on and take a look at کی جی اور اس پہ لوازمات کیا ہے اب میں نے کہا کہ یہ کیونکہ binary operators ہیں تو اس میں دو arguments جانے لازمی ہیں کیونکہ یہ member functions یعنی member operators نہیں ہیں لہذا ان کے arguments دو بنیں گے جو parentheses کے اندر ہم لکھیں گے یاد رہے کہ جب ہم member operator بنانے چلے تھے for example plus ہم نے لکھا تھا as a member operator of a class if it was a member operator تو left-hand side پہ ہماری class کا object آتا تھا کیونکہ object آتا تھا تو plus operator کو وہ object کی values ویسے ہی مل جاتی تھی یعنی there was no prefix needed no x.i or y.j needed where x and y were the objects and i or j were the internal data members وہ اٹمیٹکلی مل گئی اور right-hand side پہ جو چیز آنی تھی وہ single argument کے طور پہ ان operators کو جاتی تھی that was the case of member operators یہاں پہ ہم بنانے جا رہے ہیں friend operator the friend operator کو ہم دو arguments دیں گے پہلہ argument وہ ہوگا جو کہ operator کے left-hand side پہ آنا ہے یعنی stream object ہوگا اور دوسا argument جو ہوگا جو operator کے right-hand side پہ آنا ہے وہ ہوگا ہمارا جو object ہے یعنی ہماری class کا جو object ہے وہ argument پیش کیا جائے گا now let us go and try and overload a stream insertion operator let's say پہلے ہم output کو try کر لیتے ہیں اب دیکھیں پہلے تو prototype کی اوپر تھوڑا ساکور کر لیا جائے کہ جی اس اپریٹر کا prototype لکھا کیسے جائے گا پہلی لائن جو ہم declare کرتے ہیں so we have to worry about the return type return type کیا ہوگی operator کی پھر operator کا نام کیا ہوگا یا اس کے لکھنے کا syntax کیا ہے اس کے بعد اس کے arguments کیا ہے let us talk about the return type of this operator first ہم stream insertion operator بنانے جا رہے ہیں یاد رہے ہم لکھتے تھے c out less than less than i less than less than j less than less than k how did that work پہلی چیز یہ اپریٹرز کام کرتے ہیں from left to right سب سے پہلے c out less than less than i جہاں ijk integers ہیں for the moment c in c out less than less than i جو ہے وہ کام میں آتا ہے so that operates i کی value screen پر display ہو گئی لیکن اب statement کا باقی والا حصہ جو ہے یعنی less than less than j اس نے بھی کام کرنا ہے وہ ایکسپیکٹ کرتا ہے کہ left side پر مجھے کیا نظر آئے گا c out یعنی stream object جو تھا output stream کا object وہ ہی نظر آنا چاہیے that in fact is the return type of this stream insertion operator اگر ہم operator کو cascade کرنا چاہیں اور یاد رہے یہ ہمارا option ہے but that is the spirit of the operator پر ایک واقعا ہمارا ہے then the return type of the operator will be a reference to the o stream object clear which means what we will do is we will write something like o stream and so it will be an object of type o stream and means یہ اس کا reference ہو گا so ampersand sign اس کے بعد کیونکہ یہ کسی کلاس کا ممبر نہیں ہے یہ freestranding operator ہے عقبت کا سقل ہے اور اس کے بعد اس کے آرجمان سائنگے آرجمان ہے کہ یہ آرجمان ہے تو first one will be the stream object itself تو وہاں پے ہم لکھیں گے ostream and let's say os where output لکھتی ہے for clarity now what are we writing the first argument is a reference to the output stream اپنا کوئی نام دے دیا ہے اس کا نام رکھتی ہے ۔ پھر آئے گا کومہ اور پھر ہماری کلاس کو اپجیکٹ آئے گا. سو کوئی بھی کلاس جو ہے ہماری لیت سے ٹرک یا ویحکل کلاس ہے. سو ہم کہتے ہیں ویحکل اے. That will be the second argument that is provided to this operator. ابھی ہم آگے جاکے اگزامپل بھی کورت کریں گے اس میں میٹرسیز کے ساتھ deal کریں گے تو وہاں پہ میٹرس دی آجائے گا یا جو بھی ہم اپجیکٹ دینا چاہتے ہیں. سو لیٹس look at this line again. return type is a reference to the output stream. سو it is o stream and operator ہے اس کا سنٹیکس ہے operator less than less than. اس کے بعد اس کے آگومنٹس ہیں جو پہلہ آگومنٹ ہے وہ چیز ہوگی جو کہ operator کے left hand side پہ آئے گی لہذا وہ یہی output stream کا object ہے اور اس کا ایک reference ہے it is not the object itself it is passed by reference. سو it is o stream and اور یہاں پہ کیونکہ ہم اپنا function لکھ رہے ہیں تو جو مرزی ہمارا دل کرے ویریبل کا نام دینا وہ دے سکتے ہیں ہم o stream object کو نام دین گے output for the moment اور پھر comma کے بعد ہم نے لکھ دیا ہماری کلاس کا جو بھی object تھا ہم نے کہا vehicle x یا vehicle d or whatever parentheses is closed. یہ اس کا function کا prototype ہے اس کی definition جو ہے اس میں اب جیسے ہم see out استعمال کرتے تھے یہاں پہ ہم output استعمال کریں گے exactly like in any ordinary function جب ہم کوئی value pass کر دیتے ہیں اور pass کرتے وقت اس کے prototype میں یا اس کی definition میں کوئی name دی دیا ہم نے object کا یا variable کا تو function کے اندر وہ name استعمال ہو رہا ہوتا ہے. تو اب یہ غلطی نہ کیجے گا کہ اوپر آپ نے definition میں parentheses کے اندر لکھ دیا o stream and output اور body کے اندر آپ see out استعمال کرنا لکھ بڑے see out automatically replace ہو جائے گا جب بھی operator call ہوگا. so we will work with generic names. اب جو function کی body ہے its an ordinary function you can do whatever you want with it but if we are making it a friend function of the class let's say ہماری ایک جو class vehicle تھی اس کا یہ friend operator ہے تو پھر ہم vehicle کی جو بھی internal data members ہیں ان کو directly handle کر سکتے ہیں so vehicle may have number of seats, number of tires, length, height, weight یہ اس کے private data members ہو سکتے ہیں تو اس اپریٹر function کے اندر we could use something like output less than less than let's say ہم نے اگر اس کا جو object تھا وہ d تھا تو d.seats let's review this for a moment before we get lost ہم ایک vehicle کا ایک سامپل لیکے چلے ہم نے کہا جی ایک vehicle کلاس ہے اس کے اندر ہمارے پاس number of seats is defined through the variable called seats and it will be of type integer اسی طریقے سے number of tires بھی ہو سکتا ہے of type integer and so on maybe اس کی make ہو سکتی ہے کس manufacturer کی بنی ہوئی ہے یہ vehicle which will be a 4 pointer which means it will be a string so جب بھی ہم overload کر رہے ہیں اس کے اندر ہم نے اگر اب output کرنا ہے number of tires so all we write is output less than less than d.tires where d is the object that we had passed into this function remember ہم function لکھ رہے ہیں جب اس کو call کیا جائے گا تو actual object کا نام یہاں پر replace ہو چکا ہوگا automatically we don't do anything about it we writing a function why can we write output less than less than d.tires اس کو بھی دیکھ لیں پہلی چیز جب یہ function call ہوگا operator call ہوگا or left-hand side پہ see out پڑا ہوگا تو output کی جگہ پہ یہاں پہ see out ایک point دوسرا کی جی see out less than less than d.tires is that a legal statement the answer is it is absolutely legal because of what میں ابھی بات کی تھی کہ جی tires ہم نے ایک integer declare کیا ہوا ہے اگر ہم نے int declare کیا ہوا ہے تو see out کو int display کرنا آتا ہے of course آتا ہے that was a native data type see out is already overloaded for type int which means اب ساری اپروچ کو دیکھے ہم جو بیسیک building block سے اس سے ہم ایک امارت تعمیر کر رہے ہیں پورانی انٹیں جو ہمارے پس already موجود تھیں جن کو ہمیں لگانا آتا تھا ان انٹوں کو ایکٹھا کر کے ہم ایک نئی دیوار کنسٹ کر رہے ہیں see out object knows how to handle the native data types now we are going to use it to handle objects of our own class اور صرف یہ نہیں ہے کہ جی نمبرزی output کریں آپ چاہیں تو class کو کسی special طریقے سے output کریں شاید ہم اس ویحکل کی output چاہیں کہ اس کا نام ایک neatly formatted paragraph آئے make of the vehicle is something اس کے بعد the number of tires is 4 number of seats is 6 and so on we might want a full paragraph and we could write this in the stream insertion function operator تاکہ ایک آپ لکھیں وہاں پہ see out less than less than d یا دی ہمارا ویحکل کلس کا object ہے تو output پہ پورا paragraph لکھا وہاں آئے now this is how we constructing the operator so back again inside we can use any functions that are available to us at that time functions بھی operators بھی objects بھی جو بھی public interface میں ہمارا پاس available ہیں so اب کیونکہ ہم نے اس کو friend operator بنائے کلس کا as a friend it has access to the private data of the class and therefore we could use something like d.tires normally class کے interface میں tires چھوپے ہوں گے اور اس کے لیے یا ہم نے کوئی set function رکھا ہوگا get function رکھا ہوگا یہاں پہ ہم نے friend بنائے کے اپنی کلس کو کھول دیا ہے جب میں نے friend functions کی بات کی تھی in earlier lectures ہم نے کہا تھا کہ yes it is a way of accessing private data getting access to private data of a class but it's not recommended کہ آپ دھروں کے دھر friend functions لکھتے جائیں because that in a way negates the whole concept of encapsulation and data hiding یہاں پہ ہم تھوڑا سا اس کو relax کر رہے ہم کہہ رہے ہیں کہ you operator کو efficient لیکنے کے لیے make it a friend function this is again a guideline it is not something that you have to follow اسی طریقے سے you can just write your function but جب اس کو return کرنے لگیں on that جو مرزی لکھنا ہے آپ لکھنے so you can display the class vehicle in any way you feel you see fit but when you come to the end of the function remember the return type return type اس کی تھی o stream end which means this operator returns a reference to the output stream object اب مجھے بتائیں کہ جی اس فنکشن کے اندر output stream object تھا کنسا یعنی see out نے کس نام سے اس فنکشن میں اپیر ہونا ہے وہ نام آپ کو اس کی جو اوپر والی prototype declaration ہے اس میں نظر آ رہا ہے وہ ہے output جب آپ ریٹرن کرنے لگیں گی یا فنکشن ختم ہوگا تو اس کی last line should be return output now why don't we say return and output now by the rules of referencing وہ کمپائلر ہماری لیے سارا کام کر دیتا ہے ہم نے تو object کا نام دے دینا ہے اور کیوں کہ اس کی return type is a reference to this object the compiler takes care of it it will return a reference to the o stream object یہ پورہ فنکشن اب ذرا سا ریو کر لے what happens is that if we were to actually call it using something like see out less than less than d where d is an object of our class how will this operate جب یہ فنکشن call ہوگی what will the compiler generate it will generate a call to o stream and operator less than less than o stream and output comma vehicle d اس فنکشن کو اس نے call کر لینا ہے but simply writing that line see out less than less than d جب یہ call ہوگا تو جو فنکشن ہے operator function اس کے اندر output کی جگہ پہ see out چلا جائے گا اور جو بھی vehکل کا object فنکشن میں نام دیا ہے وہ ہمارا جو main program میں object کا نام تھا وہ اس کی جگہ پہ چلا جائے گا اب output کے ساتھ اب جو بھی data display کرنا چاہتے ہیں چاہیں تو کوئی manipulation بھی کر لیں not recommended it violates the spirit of the operator but at the end you will return output which means it returns a reference to see out جس نے اس کو call کیا تھا اس reference کو return کرنے کا فائدہ you can now chain statements together you could do something like see out less than less than within quotation marks the description of the vehکل is backslash in new line آگئی and then continuing on quotation marks ختم کر کے پھر less than less than d لیکن اب ہم نے کیا کیا ہے ہم نے mix and match کرنا شروع کر دی ہے پہلا والا جو ہم نے statement لکھی ہے see out less than less than the description of the vehکل وہ ordinary operation ہو رہا ہے یعنی see plus plus کو already پتا ہے کہ جی string کو see out کے ساتھ so see out میں the stream insertion operator is already overloaded for a string data type or you have stream.age کے اندر دیکھ چکے ہیں لیکن وہ return کیا کرتی ہے once this left to right statement has been executed this part of the statement it returns an object of type see out so the other remaining part of the statement becomes see out less than less than d where d is our own class کا this is our own object اور اب یہ friend function call ہو جائے گا friend operator جو بنایا تھا ہم نے اور پھر یہ بھی see out return کرے گا اس example میں ہم اس کو آگے استعمال نہیں کر رہے لیکن اگر کرنا چاہیں وہ بھی کر سکتے ہیں so just let's recap this whole operation the overloaded stream insertion operator must return a reference to the o stream object because we are writing functions so we have the freedom recommend it because we can cascade output operations because this is not a member operator it will have two arguments left hand side because stream object is coming so first argument will be the stream object or rather more accurately a reference to the stream object the second argument object of any of our classes which we have defined or وہ اس کو as an argument پیش ہوگا اس کے بعد within the operator function we can do what we like since we've made it a friend we can manipulate the private data member of the class in other words because we are writing an output function so we can present it we can actually work with the private data members and then at the end we must return the o stream or the output stream object تاکہ وہ reference والا جو ہم نے prototype definition میں لکھا تھا the whole operator is returning a reference to o stream let us look at a specific example ہم ایک کلاس لے لیتے ہیں ایک matrix کی کلاس لے لیتے ہیں two dimensional array ہم نے استعمال کرنیئے let's say چھوٹی سی matrix بنائے three by three کی اس کے اندر ہم نے ایک کلاس رکھلیے private جس کے اندر آگیاں انٹ روز کمہ کالمز یا کالز سو روز اور کالز will define the number of rows and columns of this matrix ہم اس کو for the moment سیمپل رکھتے ہم fix ہی کر دیتے so we can write something like روز is three and call is three اور پھر اس کا دیتہ دیتہ جو ہے وہ بھی ہم کہتے ہیں انٹ elements three three square brackets so it's a two dimensional array of three elements three rows three columns یہ تو matrix class کا private دیتہ ہو گیا ہم چاہتے کیا ہیں کہ جی ایک output operator لکھیں جو کہ کام کیا کرے وہی کام جو میں نے آپ کو as an exercise کہا تھا کہ جی پچھلے لیکچر میں آپ کرے you need write or rather using the formatting functions that you now know write or display the matrix in a nicely formatted fashion so you can use those graphical characters جو میں نے بتایا تھا کہ all to the back three digit code استعمال کریں اور پھر اس کے square brackets بڑے سے بنا کے اس کے اندر three number print کریں جو کہ nicely aligned ہو using the set width functions set w جو ہے یہاں پے اب وہ سارا کام اٹھاکے آپ output operator کی اندر لکھ سکتے ہیں so what you could do is number one declare a friend operator the friend operator must be make inside the class so inside the class وہی سارے جو prototype ابھی تاک ہم نے develop کی ہے ہم کہتے ہیں اس کے آگے word لگا دیتے ہیں friend ہم کہتے ہیں friend ostream and operator less than less than within parenthesis ostream and output comma matrix m so یہ اس کی prototype definition ہو گئی and of course semi colon آئے گا اور class کے اندر ہم نے اس کو as a friend declare کر دیا جو ابھی میں نے guideline دیتی کہ اب class کی جہاں پہ بھی definition ختم ہوتی اس کے فورن باز ہم normaly class کے member functions لکھ رہے ہوتے ہیں member functions لکھتے وقت آپ کو یاد ہو گا کہ class colon colon اس طرح سے ہم define کرتے ہیں کہ یہ function ہے اس class کا member ہے یہ operator جو ہم define کرنے جا رہے ہیں یہ تو class کا member نہیں ہے it is a friend operator لہذا اس میں وہ colon colon اس طرح سے سنتیکس نہیں آئے گا یہ actually standalone operator ہے باکی سنتیکس وہ ہے جو ابھی ہم نے cover کیا so I'm ostream and operator less than less than ostream and output comma matrix m یہ اس کے definition کی پہلی line ہو گی اس کے بعد matrix کا display آئے گا سمپل کر لیتے ہیں for the moment I'll leave the exercise part up to you but you can cut and paste the code that you have written already for formatting the matrix یہاں پہ صرف اور صرف آپ کو ایک چیز کا خیال رکھنا ہے جب بھی آپ output کرنے جائیں گے اب آپ کے پاس matrix والا object وہ m کے نام سے آیا ہوئا ہے اس کے elements کو آپ ہاتھ لگا سکتے ہیں so you could write a standard nested loop because matrix وہ rows and columns کی ہے اس کو display کرنے کے لیے ہم کیا کرتے ہیں for int I equal to zero I less than rows increment I so now you're going row 0, row 1, row 2 3 by 3 matrix ہے اس طرح سے چل رہی ہوگی اس loop کے اندر آپ ایک nested loop لکھتے ہیں آپ کہتے ہیں for int J equal to zero J less than calls increment J جے will be going column number zero column number one column number two loops کیوں کہ nested ہیں چلنے کا sequence یہ ہوگا for row number zero column number zero پھر column one پھر column two پھر row number one column zero column one column two I'm sure you're familiar with nested loops now so I don't need to labour this point too much in nested loop کے اندر جاکے now you can access element of IJ یہ نہیں ہے square brackets کے ساتھ which means the specific element of the matrix کنسی matrix جو اس function کی اندر m کے نام سے آیا ہوئی ہے so the object came in with the name m سو now you can do something like output less than less than m dot elements or element of IJ سمپر جو c out کے ساتھ آپ نے لکھنا تھا اگر یہ ممبر function ہوتا یہاں پہ آپ لکھ رہے ہیں in a friend operator you're using the output والہ object which happens to be coming in بعد میں c out بن جائے گا جب ہم استعمال کرنے جائیں گے لیکن ہمارے operator کے اندر اس کا نام output ہے اور دوسی طرف m جو ہے وہ matrix ہے جس کے elements کو ہم access کر رہے ہیں element ہم نے کہا یہ matrix کا private data member ہے so یہاں پے access کیسے ہو رہا ہے اس operator کو ہم نے بنایا ہی friend operator تھا friend function کے طور پہ ڈیفائن کیا تھا so that basically is the way that we use let's say or define stream insertion operators اب اگر ہم اپنی attention کو اگی طرح سے expand کریں اور کہیں کہ جی stream extraction کیلئے کیا کیا گیا جائے stream extraction is something like see in greater than greater than i where normally our i جو ہے وہ integer ہوتا ہے یا کوئی or native data type ہوتی ہے اب اسی کو لے لیں ہم کہتے ہیں matrix کیلئے ہم کرنا چاہتے ہیں see in greater than greater than x جہاں x جو ہے is an object of type matrix وہی ساری چیز جو ابھی ہم نے stream insertion operator کیلئے بات کی اب ہم stream extraction operator کیلئے کرنے جا رہے ہیں the operator is binary اس کے دونوں طرف کوئی چیز آتی ہے left side کیوں پر see in object بیٹھا ہوا ہے in other words an object of type is stream right hand side کیوں پر ہماری کلاس کا کوئی object بیٹھا ہوا ہے in this example an object of type matrix so it's a binary operator کیا یہ matrix کا member operator ہو سکتا ہے answer is no اس کے تو left hand side پہ i stream object آ رہا ہے so left hand side پہ matrix نہیں آ رہی تو یہ matrix کا member operator نہیں ہے لہذا اب یا وہی بات کہ آپ set functions استعمال کریں اگر آپ نے کلاس matrix کیلئے لکھے ہوئے ورناہ جیسے ہم پہلے کر چکے ہیں ہم اس کو بھی friend function بناتے ہیں friend operator of the class how do we define it within the class matrix we say friend i stream and operator greater than greater than پرانثیسیس کیا اندراب دو آگومنٹ را ہوں گے پہلے آگومنٹ will be i stream and input now input ہمارا place holder ہے it's the temporary name that we are using for the i stream object پھر comma matrix m now we define those two arguments that go into the stream extraction operator یہ اس کا prototype ہو گیا جو ہم نے friend بنا کے class کے اندر declare کیا class کے باہر نکل کے جب ہم operator کو define کرنے چلیں گے تو اس کے بارے میں آپ نے وہاں پہ تو friend نہیں لکھنا it's a freestanding operator so we say i stream and why are we saying i stream and same argument جو کہ ہم نے o stream کے لیے استعمال کیا تھا in other words ہم operator کو cascade کرنا چاہیں گے we want to do something like see in greater than greater than i greater than greater than j greater than greater than m where m is our matrix پھر اس کے بعد greater than greater than لگا کے کچھ اور بھی ہم کرنا چاہیں کیونکہ ہم cascade کرنا چاہتے ہیں تو اسی argument کے تحت جب پہلہ see in چلے گا وہ operation input تو لیکے کسی variable میں ڈال دے گا but it must return a reference to an i stream object in other words it must return a reference to see in so اس میں ہم نے prototype کیا اس کی definition کیا اندر بھی ہم نے کہا کہ اس کی return type ہے or return type جو ہے وہاں ہے i stream and it is a reference to an i stream object and that normally will be see in اس کے بعد وہی کیورڈ آگیا operator greater than greater than اب یہ stream extraction ہو رہی ہے اور اس کے بعد اس کے arguments آنے ہیں پہلہ argument وہ ہوگا جو operator کے left-hand side پہ آتا ہے so in other words that will be our i stream object so we write i stream and as usual this is a reference to the i stream object not the object itself so we say i stream and input ہم نے نام دی ہے جو آپ کا دل کرے وہ نام دیں یہاں پہ do not use reserved words so you don't want to use see in you can use ip you can use is short for input stream جو دل کرے ہم اس کو input کہہ رہے پھر comma second argument will be matrix m یہ اس کی definition کی پہلی لائن ہو گئی اب آجیں operator کی اندر اب ہم matrix کو اب یہاں پہ دیکھیں ہمارے پاس کی آتی ہے کیوں کہ یہ ایک ordinary function ہے جس کو ہم لکھنے جا رہے ہیں یہاں پہ آپ see out بھی استعمال کر سکتے ہیں so you could actually prompt the user from within the input statement ہم پہلی لائن لکھ دیتے ہیں please enter the values of the matrix or 3 at a time یا جو بھی ہم جس طرح سے پرنا چاہیں so you can actually give a prompt to the user اس کے بعد پڑھنے کا طریقہ اس matrix کیلئے یا اس example کیلئے بالکل وہی ہے جو ہم نے output کیلئے استعمال کیا تھا in other words we will use nested loops پہلے ہم loop چلا دیتے ہیں rows کے اوپر so for int i equal to 0 i less than rows increment i اس کے braces شروع ہوئے اندر والی nested loop کہتی ہے for int j equal to 0 j less than calls j plus plus increment j اب یہاں پہ we are going to be user friendly again اندر والی loop کیا اندر we can now start using prompts so we can do something like see out less than less than please enter the value of element اگے less than less than i comma less than less than j now it is nice for the user to be able to see please enter the value of element 0 comma 0 اس کے بعد آئے گا please enter the value of element 0 comma 1 and so on so prompts ساتھ ساتھ آ سکتے ہیں اب جو user سے پڑھنی ہے چیز وہ ہم place کہاں کرنا چاہتے ہیں اس matrix example میں اس کی element 2 dimension اریک اندر ہم دالا چاہتے ہیں ہم کہتے ہیں input یاد رہے ہمارا جو i stream object تھا جو declaration لین پے اس کا نام تھا input یہاں پہ input greater than greater than m dot element i j جو ہے وہ index ہیں subscripts ایرے element کیلیے اور ان کی value loop سے حاصل ہو رہی ہے سو ہم جانتے ہیں ہمارا جانتے ہیں ہمارا جانتے ہیں and place the value درک لی into the element ایرے same reason as in the output case we can place it in the array because we have made this operator private data of the class یہ اب double loop چلکے ہم نے ایک ایک کر کے matrix کے سارے elements پر لیا اور اس کو matrix کے اندر store کر دیا function ختم کرنا ہے تو we want to return and a reference to an object of type i stream i.e input stream type object کا ایک reference return کرنا ہے so we just say return input was the name and of operator function i stream and ہم نے اوپر والی لائن پر لکھا کہ یہ اس کی return type ہے اس نے automatically return input کو as a reference treat کر کے واپس کر دیا اب یہاں پہ ایک چیز کا خاص خیال رکھنا ہے اور وہ بہت important ہے یہاں پہ جب ہم output کرنے چلے تھے matrix کو تو دیکھے matrix کو ہم کچھ نہیں کر رہے تھے we were just returning values لیکن اس کی function could have been a call by value we could have sent the values of the matrix and displayed them on the screen no problem کہ original object پڑا ہوا ہے اس کی ایک copy بناو اور copy کو screen پہ print کر دو on the other hand جب ہم matrix کو input کرنے جا رہے ہیں لیکن ہم be careful since the call to the operator is nothing but a function call we want to make sure that the function call is a call by reference and not a call by value output کے لیے call by value is fine وہاں پہ اگر ہم call by reference استعمال کریں تو وہ ہوگا for the sake of efficiency تاکہ پورے object کی copy نہ بنانی پڑے اس کا reference لیکن input وقت input کے وقت it is necessary it is important to remember this point it is necessary to send a reference to the object تاکہ جب آپ values پڑیں or array کے اندر store کریں تو وہ in this case element array وہ matrix object کی اندر بھی values کو وہاں پورا اندر اگر جو mechanisms اگر اگر Now اس کا اس کا اگر اگر اگر اگر اگر پر اس کا دباب اس کا اگر دمرا którego جیٰ comma matrix and m a reference to an object of type matrix یہ کرٹکل ہے اس کو یاد رکھئے گا جیساً reference بھیجنا ہے جب بھی آپ انپورٹ کر رہے ہیں otherwise original object کو کچھ بھی نہیں ہوگا اس کی کوپی جائے گی کوپی میں values انپورٹ ہو جائیں گی اور original object ویسے کا ویسے پڑھا رہ جائے گا یہ سارہ کام کرنے کا ہمیں فائدہ کیا ہوا ہمیں فائدہ کیا ہمیں ویسے بھی گا انسان ہے یہ ساری ہاں جیساً آپ کو یہ ساری رہا ہوں ہمی نقیض بھییت پر میٹرکس کیا ہے میٹرکس کیا ہے ایک بھی گیٹ میٹرکس میٹرکس سے کیا ہے اور ایک بھی دیسپلی میٹرکس کیا ہے یہ میٹرکس کے ساتھ میٹرکس اور ہمیں گے میٹرکس کیا ہے اور اُس نے پرامپ دیکھے سارا کام وہ کیا کر لینا تھا جو ابھی ہم نے اپریٹر میں کیا ہے دوسرہ might have been m.display matrix and it would have displayed the matrix in a nice format on the screen ہم نے جاکے operators overload کییں ہیں کیا فائدہ ہوا؟ فائدہ یہ ہوا کہ جب ہم program لکھنے جا رہے ہیں تو وہاں پہ اب ہم لکھ رہے ہوں گے c in greater than greater than m where m is the object of type matrix جیسے ہم نے c in greater than greater than i لکھا تھا for an integer we can now write it for a matrix matrix کو اوٹپٹ کرنا ہے سکرین کے اوپر انٹیجر کو کیسے اوٹپٹ کرتے تھے c out less than less than i یہاں پہاں ہم کریں گے c out less than less than m matrix اوٹپٹ ہو جائے گی in other words the readability of the program goes up i think it goes up by orders of magnitude we start looking at things exactly the way as we were handling native data types ساری ہم جو چیز کرتے رہے ہیں اس کے اندر ہم کیا اچیب کرتے رہے ہیں we have been in a way extending the language ہم نے جب classes define کی we started defining user defined data types اسی کو میں نے کہا تھا کہ class کیا ہے user defined data type ہے پھر اس کے objects create کیے which are like ایک native data type کا ایک instance ہوتا ہے int i i is a data of type integer ہم نے کہا matrix m وہ جناب matrix کیو ہے becomes an object of class matrix اسی spirit کو آگے لیتے ہوئے in other words extending the language what we have done is now we have extended the operators and you see in or see out we have ordinary built in native data types ہم نے اس کو استمال کر لیا ہے with our own classes and its objects overloading operators is quite a generic activity in other words we can write overloaded operators any way we want nonetheless for certain types of classes especially classes جہاں کے اوپر ہم arithmetic data استمال کر رہے ہیں matrix ہو گئی complex numbers ہو گئے it is nice to be able to overload almost all of the arithmetic operators and in particular overload the insertion and extraction operators as well so that when we write the program it looks exactly the same as we would be writing for native data types nonetheless کہی نا کہی لائن لگانی ہے so I'll leave it up to you to make an intelligence decision کے جب آپ اپنی کلاسس لکھ رہے ہیں اس کے اندر کون کون سے operators overload کرنے ہیں اور کون سوں کو علیدہ آپ functions کے through handle کریں گے why you make this distinction is well otherwise you can keep on writing a class forever یہ بھی کر لیتے ہیں وہ بھی کر لیتے ہیں کہیں آپ کو practical limit determine کرنی پڑتی ہے this will come with experience but nonetheless remember one thing آپ نے کلاس کو present کرنا ہے ہمیشہ کلاس لکھتے وقت یہ سوچیئے گا یہ کسی اور نے استمال کرنی ہے کسی اور کے استمال کو اگر آپ آسان بنا سکتے ہیں then you would have succeeded in your purpose make it obvious make it easy do not do strange things as stream insertion operator should remain a stream insertion operator regular operator cascade ہو سکتا ہے یہاں پہ بھی cascade بنائے and so on so forth next time we will look at two small topics but which are very important in writing our C++ programs till that time Khuda hafiz