 اسلام علیکم. Today's لیکچر No. 33 of our course CS201 Introduction to Programming آج کے لیکچر میں ہم اپریٹر اوبرلوڈنگ کا جو کنسپ تھا یا طوپک تھا اسی کو continue کر رہے ہیں اور کچھ ہم ایسائنمنٹ اوپریٹرس کے اوپر بات کریں گے پھر جو میں نے پیشتی دفعہ ذکر کیا تھا جو اس کو explicitly explain کریں گے کہ یہ this pointer جو ہوتا ہے یہ کیا چیز ہے کافی important چیز ہے اور یہ اپریٹر اوبرلوڈنگ میں بہت کام آتا ہے پھر ہم آگے چلے کچھ ان کی ڈیٹیل کے ایک سامپل سے دیکھیں گے اور شاید ہم conversion for functions جو ہیں ان کو بھی آج کور کر پائیں تو آئیے شروع کرتے ہیں by taking a brief overview of what operator overloading is all about دیکھیں I had mentioned that to be able to write code that looks simple and clean sometimes we want to overload operators in our classes کوشیس یہ ہوتی ہے کہ اگر ہمارے پاس کوئی class defined ہے اور اس کے objects ہیں اور دو objects کو ہم جمع کرنا چاہتے ہیں اور جمع کا مطلب اس class کے لیے pertinent ہے it's specific to that class تو ہم چاہیں گے کہ object A اور object B کو ہم A plus B لکھ سکیں so it means we're adding two different objects and remember objects are instances of a class and a class is nothing more than a user defined data type تو ہم چاہتے ہیں کہ ہمارا code جو ہے وہ بڑا simple اور elegant نظر آئے یہ بھی میں نے بات کی تھی کہ جی class لکھتے لکھتے پتہ چلا کہ جی ہم بہت سارہ code class کی definition کے اندر لکھ رہے ہیں اور جب ہم class استعمال کرنے آتے ہیں تو اس وقت کام بہت آسان ہو جاتا ہے so in object based programming or even in object oriented programming افرٹ جو ہے ہماری وہ زیادہ تر classes کی definition کے اوپر ہو جاتی ہے because now the classes are data types that know how to manipulate themselves they know how to add objects of their types together they know how to display themselves they know how to do many other manipulations ہم نے date class کی لیکے ہم نے کچھ examples کور کیئے تھے کہ جی اگر date کو increment کرنا ہو تو کیسے کرتے ہیں and I mentioned that there are many things that you want to take care of and it is best encapsulated in the class itself not in your main program when you come around to using the date class آج ہم بات کرنا چاہ رہے ہیں assignment operator کی assignment operator ہمیں کب چاہیے ہوتا ہے assignment operator ہمیں کب چاہ رہے ہیں جب ہمیں کب چاہ رہے ہیں جب ہمیں کب چاہ رہے ہیں something like a equals b اب نواملی میں نے پہلے ذکر کیا تھا کہ جی c++ آپ کو ایک default assignment operator دے دی ہے what it does is that it does a member wise assignment تو اگر آپ کی class کے اندر let's say structure جو ہے data members جو ہے وہ تین integers ہیں دو floats ہیں اور آپ اس کے دو objects a اور b لے کے آپ لکھتے ہیں a equal to b تو what is happening is کہ جی پہلہ انٹیجر پہلے انٹیجر میں کوپی ہو جاتا ہے دوسرے کی value دوسرے انٹیجر میں چلی جاتی ہے and so on it's a member wise copy default assignment operator تو لنگویج نے ہمیں Provide کر دیا what happens if we want to do something more we want to do something special handle special cases وہ cases بھی ہم دیکھیں گے کب آتے ہیں and that in fact is an interesting class of classes جو کہ SPECIFICALLY ہم ایک علیادہ لیکٹر میں بھی کوپر کریں گے اوپسے لے کے نیچے تھا کہ ان کے لیے کیا لوازمات ہیں but let's take a look at our favorite class which is a string class string class جو ہے ہم اپنے لیے دیفائن کر لے ہیں I'm c++ کی built-in string class کے بھی بات نہیں کر رہے what it will be is simply a class which has a character array inside as a data member remember a string is nothing but an array of characters تو ہم نے اپنی ایک string class دیفائن کی اس کے اندر اس کا data member جو ہے وہ buffer ہے so buff ہم نے لکھا ہوا ہے that is a character array اور اس کو ہم پاکی constructors بھی ہیں and destructors بھی ہیں اب اس کے لیے assignment operator کا ہم نے فکر کرنا ہے suppose ہمارے پاس کوئی constructor ہے جو کہ allow کرتا ہے buffer کی اندر کوئی string place کرنے کا so I can say something like in my main program string s1 within parentheses or double quotation marks کے اندر میں کوئی string دی دیتا ہوں something like this is a test تو ایک string object create ہو گیا initialize ہو گیا اور اس کے buffer کی اندر yes string place ہو گئی and buffer will be large enough to hold that string as defined in our constructor what happens if I have another object string object let's call it s2 اور میں لکھنا چاہوں s2 is equal to s1 اب دیکھیں buffer جو ہے وہ in this case is nothing but a pointer to a memory location if it's an array of characters then the name of the array is nothing but a pointer to the start of the memory location اگر default assignment operator استعمال ہو جا یہاں پے so what will happen is کہ جی ایک pointer کی value یعنی buff کی value دوسرے object کے buff کی value کی اندر چلی جائے گی یعنی the same address will now be found in both of these objects suppose you delete one object وہ سکوپ میں سے ختم ہو جاتا ہے چلا جاتا ہے doesn't exist normally اس کے سم کے object کا جو destructor ہے وہ memory house keeping کرے گا ہی گا کہ ہم نے جب object create کیا تھا تو ہم نے free store سے کچھ memory allocate کی تھی اب اگر یہ object مرنے لگا ہے تو وہ memory واپس free store پے بھیج دو تو وہ s1 object کی جو memory allocated کی تھی وہ فارق کر کے free store پے بھیج دے گا لیکن اس بچارے s2 کا کیا ہوا جس کو ہم نے کہیں پے کہہ دیا تھا s2 is equal to s1 s2 کی اندر اب buff جو ہے اس کا character array اس کا نام جو ہے it now holds an address of memory جو actually free store پے جا چکی ہے it no longer is allocated اس کے سم کے جو problems ہیں وہ بار بار آتے ہیں اور اس کے لیے ہمیں اپنا assignment operator لکھنا پڑتا ہے before going on into the string assignment operator let's step back and look at look a little bit at the addition operator جو ہم نے strings کے لیے ڈیفائن کیا تھا اس کے اندر بھی ایک fine detail point ہے جو میں آج discuss کرنا چاہتا ہوں جب ہم نے strings کے لیے addition operation ڈیفائن کیا تھا تو ہم نے کہا تھا کہ جی اگر ایک string ہو اور اس میں دوسی string add کرنی ہو یعنی اس کو concatenate کر کے بڑا کرنا ہو تو کیا کیا جائے اس پرکت ہم نے ایک بڑا simple structure دیا تھا کہ جی string ہماری جو defined ہے وہ ہے character buff اور اس میں 30 characters کی جگے ہے اگر 30 characters کی جگے ہے اور ہمارے پاس دو string objects ہوں اور دونوں میں strings بھری پڑی ہوں یعنی ایک میں کوئی 20 characters کی string ہے ایک میں 20 characters کی string ہے تو وہ جماہ کیسے ہوگی now for the moment کیونکہ ہم کوئی memory allocation نہیں کر رہے ہم نے ایک fixed length buffer رکھا ہے string object کی اندر تو it is important کے plus operator جو ہے وہ error checking کرے وہ پہلے ایک string کی string length لے پھر دوسی string کی string length لے دونوں کو جماہ کرے اور دیکھے کہ وہ 30 جو ہم نے defined کی ہوئی ہے کہ string کی length inside the object اس سے زیادہ تو نہیں اور اگر زیادہ ہے تو پھر وہ empty string return کر دے یا کوئی or logical behavior اس کے لیے ہم define کر دیتے ہیں otherwise وہ assign کرے یہ ایک چھوٹا سا aside تھا to show کہ the error checking ہر جگہ پہ ہمیں کرنی چاہیے now we come to actual allocation using the assignment operator دیکھیں میں نے پہلے بتایا کہ آپ کو problem کی آتا ہے problem کی آتا ہے کہ جو buff ہم نے define کیا ہوا ہے it must not point to the same memory location in two different objects of type string ہرے کی اپنی string کی جگہ ہونی چاہیے ممری میں اور اس کی اپنی value ہونی چاہیے so when we write a statement like s2 equal to s1 we want to make sure کہ assignment کے وقت pointer addresses assign نہ ہو جائیں بلکہ special جگہ بنے اور پھر اس جگہ کے اندر strings copy ہوں how do we do this let us take a look at the code itself in fact it's quite straight forward what you want to do is کہ جی operator equal to define کر رہے ہیں string class کے لیے for the moment remember کہ جو left side پہ object ہے وہ call کرے گا equal operator کو so if we write a statement like s2 equal to s1 تو s2 جو ہے وہ calling object ہے function کا اور s1 جو ہے وہ equal to operator function کو pass ہوگا as an argument so s2 کا جو data structure ہے یعنی buff وہ تو without any prefix without specifying this operator function کی اندر available ہے اور s1 جو ہے اس کا buff جو ہے اس کو ہمیں s1.buff کر کے access کرنا پڑے گا so ہم کرتے کیا ہیں suppose now I'm just giving you the full concept تا کہ کوئی بھی fine point بھی نہ رہ جائے suppose s2 میں پہلے بھی کوئی value پڑی ہوئی تھی now اگر s2 میں کوئی value پڑی ہوئی تھی تو what we talking off is کہ اس کا buff جو ہے buffer اس نے memory میں کوئی جگہ allocate کی ہوئی تھی اور اس کے اندر کوئی character string پڑی ہوئی تھی تو سب سے پہلے assignment کرنے میں پہلے تو جو allocated memory تھی s2 کی اس کو فارق کیا جائے کیونکہ اس کے اوپر ہم کچھ لکھنا چاہ رہے ہیں ہمیں نہیں پتہ کہ جو چیز لکھنی چاہ رہے ہیں وہ کم ہے یا پہلی والی value سے زیادہ ہے so the first statement is delete buff پہلے اور دیکھیں یہ میں نے buff صرف without any prefix لکھا ہے that means کہ calling object کا buffer جو ہے وہ ہم delete کر رہے ہیں or delete you remember is the operator that freeze the memory its new way of doing things with C++ اب وہ buffer free ہو گیا اس کے لیے اب نئی جگہ چاہیے کتنی جگہ چاہیے جو s1 کا buffer ہے اس کے اندر جتنی لمبی string پڑی ہوئی ہے اتنی جگہ ہمیں s2 کے لیے allocate کرنی ہے تو یہاں پہ ہم new operator call کرتے ہیں اور اس کو value کیا دیتے ہیں string length of s1 dot buff اس کے one کے buffer کی string length لیے لیے اس میں ایک جمع بھی کر دیا کوئی بتا سکتا ہے کیوں جمع کیا remember c یا c++ کی strings جو ہیں ان کے اخیر پہ ایک null character لکھا جاتا ہے backslash 0 so whenever you want to put a string like this is a test into a buffer so this is a test plus one character space for the null character یہاں کو allocate کرنی چاہیے so this is a new operator کے ساتھ string length of s1 plus buff plus one ہم نے جگہ allocate کی free store سے اور اس کا address ڈال دیا ہم نے buff کے اندر اور buff یاد رہے without a prefix ہے so یہ left-hand side والے object یعنی s2 کا buff کی بات ہوری ہے جب s2 کے buff کے پاس ایک valid memory address آگیا تو ہم نے string copy کے ساتھ s1.buff کو buff کے اندر copy کر دیا اور function ختم ہو گیا now what has happened is s2 کے buff کے اندر s1 کے buff کی string copy ہو چکی ہے لیکن دونوں کی جگہیں جو ہے memory میں وہ علیہ دا علیہ دا ہے فائدہ اب آپ s1 کو delete کر دیں if the object goes out of scope یا s2 کو delete کر دیں it does not affect the other object example میں نے آپ کو strings کے ساتھ دیا ہے but this example is more general the example pertains to all classes جہاں پہ کلاس کے اندر آپ memory manipulation کرتے ہیں جب بھی آپ کسی object کے لیے memory allocate کرتے ہیں تو it is important کے اس کے لیے assignment operator یعنی equal to operator ڈیفائن کر دیا جائے ورنہ یہ ان کے pointers اور addresses کی value copy کر لے کا by default assignment operator اور ان کے actual values اور memory allocation وہ نہیں ہو پائے گی so it is important یہ ایک سامپل ہم نے string کلاس کے لیے cover کیا let's go on and take a look at what happens when we actually do this assignment دیکھیں اگر میں integers کی assignment کر رہا ہوں میرے پاس تین integers ہے i,j,k now it is legal for me to write i is equal to j supposing میں کوئی values پڑی ہوئی ہیں تو اینہ لکھتی ہے i equal to j جی کی value i کو assign ہو گئی پھر میں نے لکھتی ہے k is equal to i تو i کی value k کو assign ہو گئی no problem but as c programmers we know that we can write this in one line we can write this as i is equal to j is equal to k اور the other way round جیسے میں نے پہلے کہا تھا اس کے مطابق ہوگا k is equal to i is equal to j یعنی پہلے جی کی value i میں assign ہو اور پھر i کی value k میں assign ہو so what is the mechanism that makes this work i mentioned some lectures ago کہ c میں یا c plus plus میں ہر expression ہر ہم a equal to b لکھ رہے ہوں یا a multiplied by b لکھ رہے ہوں ان expressions بزاتے خود کی اپنی کوئی value ہوتی ہے اور وہ value جو ہے that allows these chained assignment statements to work for example ہم نے جہاں لکھا k is equal to i is equal to j تو پہلے i equal to j execute ہوا وہ expression جو ہے یا وہ an assignment جو ہے اس کی بزاتے خود ایک value return ہوگی کیا value ہوگی جو value left-hand side کو assign ہوئی ہے اینی i کو value assign ہوئی تھی وہ value expression کی value بن جاتی ہے and that is what is returned تو جو k equal to والا حصہ ہے اس کو یہ نئی value returned value نظر آتی ہے تو k کو نئی value assign ہو جاتی ہے it works that way for example اگر لکھا ہو k is equal to i equals plus plus j تو plus plus آپ کو پتا ہے is an increment operator increment you have a pre increment operator ہم نے استعمال کیا plus plus j سے پہلے لکھا ہوا ہے pre increment operator کیا کرتا ہے کہ جی پہلے جے کی value increment ہوگی by one اور پھر جو result آتا ہے وہ i کو assign ہوگا اگر آپ اس example کو بھی دیکھیں تو plus plus j نے بھی کوئی value return کی ہے تو بھی وہ assignment میں کام آسکا ہے اور پھر i کی نئی value کے تک چلی جاتی ہے how can we make this work with our string object یعنی اگر میرے پاس تین strings ہوں s1, s2, s3 اور let's say کہ جی s1 کے اندر کوئی value پڑی ہوئی ہے یعنی ایک object بنا ہوئا ہے اور اس میں کوئی value اس کی string کے buffer کے اندر پڑی ہوئی ہے can we how can we write s3 equals s2 equals s1 s2 equals s1 تو ہم نے ابھی لکھ لیا جو assignment operator کبر کیا لیکن اس assignment operator کا code پھر سے زرہ ریو کریں دیکھیں وہ code کے اندر کوئی return statement ہی نہیں تھی یعنی that operator actually return nothing so it had a void return type so it was void string void operator equal to or string colon colon ہم نے define کیا تھا اور buffer کو کوئی value assign کر دی تھی string copy کے ساتھ اور function جو ہے operator function ختم ہو گیا that means this function is not returning anything if it is not returning anything s3 equals s2 equals s1 کام نہیں کر سکتا how can we make this work یہ جادو جو ہے یہ this pointer کی through کام آتا ہے this pointer جو ہے this یہ والا the name is also self-explanatory یہ والا pointer کانسا والا pointer ہر کلاس کا جب بھی کوئی member function call ہو whenever an object calls a member function implicitly یعنی بغیر دکھائے ہوئے بغیر آپ کو بتائے ہوئے اس کو ایک calling object کی طرف سے ایک pointer بھی مل جاتا ہے اس pointer کو ہم کہتے ہیں this pointer this is a key word جو ہم اس کو بہتا ہے وہ اس پوانٹر کاندر موجود ہوتا ہے اور وہ calling object کو رفر کر رہا ہوتا ہے which means اگر میں نے یہی اگر بفر کو رفر کرنا ہو کوئی بھی arbitrary member function ہے string class کا تو یا تو میں calling object کی لئے صرف buff لکھتوں that is enough calling object کی buff کی بات ہو رہی ہے but I can also write right arrow buff which means this pointer جس چیز کو بھی point کر رہے اس کا data member called buff they are exactly equivalent I can also say a third way within parenthesis star this which means whatever this points to this کو dereference کر لیا star operator کے ساتھ جیسے ہم pointers کے ساتھ کرتے رہے ہیں اور وہ کیونکہ آپ object آگیا تو اب اس کے بعد arrow نہیں لگے گا parenthesis کے بعد full stop یہ تینو سٹیٹمنٹس for a calling object string object in our example اگر لکھا ہو buff یا لکھا ہو this arrow arrow is the hyphen greater than sign پھر buff یا لکھا ہو within parenthesis star this full stop buff یہ تینو exactly equivalent ہیں ہم جو دس والی سٹیٹمنٹس ان کو استعمال نہیں کرتے کیونکہ ان کی ضرورت نہیں ہے ہم سمکلی buff لکھ دیتے ہیں تو calling object کا buff کیو ہے buff اس کو ہم بہت they all will work you can try them out that this pointer is known to the member functions آخری والا جو میں example دیا ہے کہ پرانثیز کے اندر star this I hope you know کہ ہم نے parenthesis کیوں ڈالے ہیں کوئی idea ہے دیکھیں جو dot operator ہے جہاں ہم لکھتے ہیں object dot member in this case string object dot buff وہ زیادہ tight binding ہے اس کی as compared to star operator جو this کے ساتھ ہم نے لگایا ہوا ہے اگر آپ یہ لکھ دیں گے وہ ہو جائے گا this dot buff and then dereferenced by the star تو ہم پہلے dereferenced کرنا چاہتے ہیں تاکہ this pointer سے ہمیں object مل جا اور پھر اس object کا data member i.e. dot buff ہم لینا چاہتے ہیں اس واصطہ یہ parenthesis لگانے ضروری ہیں اب back to our topic کہ یہ this pointer اس کا کام کہاں پہاں پہاں پہاں پہاں پہاں چلیں اس کو پہلے ہم ایک تو میں نے آپ کو idea دیا کہ ہم string لکھنا چاہ رہے ہیں ایک line میں s3 equals s2 s equals s1 اور وہاں پہاں ہم استعمال کریں گے لیکن ایک اور بہت ہی important اس کا function جو ہے اس کو let us consider that problem یہ ہے کہ اگر suppose ہمارے پاس ایک int i ہو تو program میں کہیں پہ بھی اگر ہم لکھنے i is equal to i کیا ہوگا nothing it's an alright it's a do nothing do nothing line لیکن it's not even an error لیکن اب ذرا اپنے string object کی اپر ذرا خور کریں کہ ہم نے string s اور اس کو initialized کیا ہوئے with some string this is a test or something like that اور ہم کہہ دیتے ہیں s equals s میں وہ بہت بتا دوں گا کہ کہاں پہ یہ کہا جائے گا obviously you won't write any code like this but equals کا ذرا behavior دیکھیں اس وقت کیا ہوگا یاد رہے جو ہم نے equal to operator اس وقت string class کیلئے define کیا ہوئے اس میں جیسے ہی آپ جاتے ہیں وہ پہلا کام کیا کرتا ہے calling object کے بفر کو delete کرتا ہے یعنی اگر اس نے کوئی memory allocate کیوئی تھی اس کو freestore پے بھیج دیتا ہے اب جب ہم نے لکھا s equal to s تو equal to یعنی assignment operator نے سب سے پہلے s کے بفر کو فارق کر دیا اب اس کے بعد it is trying to take the buffer on the right hand side which happens to already have been deleted and it is trying to allocate space and assign it to s things break down everything goes crazy اس چیز کو کہتے ہیں self assignment یعنی x equal to x اگر لکھنا ہو اس کو کہتے ہیں self assignment self assignment directly تو normally ہم code میں کبھی بھی اس طرح نہیں لکھتے لیکن کئی جگہ یہاں جاتی ہیں کہ جی اگر آپ نے ایک object کا address کسی pointer میں رکھا ہوا ہے so we say string s comma star sptr so sptr is now a pointer to a string object and s is a string object تو کہیں پہ ہم لے sptr equals and s so string object s کا address لیا اور وہ sptr کے اندر place کر دیا اب آپ code لکھتے گے لکھتے گے اور نیچے جاکے کہیں پہ آپ نے کہا s is equal to star sptr کہیں کہ یہ string object ہے اس میں کسی ڈالنا چاہتا ہوں جو کہ sptr اس وقت point کر رہا ہے جس object کو اس کی value یہ بھل گئے کہ b is lines پہلے sptr میں s کا ہی address رکھا گیا تھا effect اس کا بالکل وہی ہوگا جو پہلے میں نے بتا ہے s equal to s والا effect ہے وہ ہو جائے گا buffer s کا delete ہو جائے گا assignment ہو نہیں پائے گی your program will become unpredictable so self assignment is very dangerous and we have to watch out for it again it is dangerous when we have memory being manipulated inside a class or string class is a classic example جھاں پہ ہم memory allocation کرتے ہیں so what should we do پہلی چیز let's go back and say کہ جی this pointer available ہے equal to operator function کو answer is yes by its very definition every member function operator function ہو your regular member function ہو اس کو this pointer ملتا ہے it gets a pointer to the object that called it which means the object on the left-hand side so equal to سب سے پہلے ہمیں test یہ کرنا چاہئے کہ جو object مجھے call کر رہا ہے اور جو object مجھے دیا گیا ہے i.e. the right-hand side وہ ایک ہی تو نہیں ہے so we should write something like اب اس کا prototype دیکھیں کہ ہم نے اگر prototype لکھا بھی void ہے اس کی return type کچھ نہیں ہے so we say void string colon operator equal to and within parentheses we say something like string other and normally it's a reference so it's string and other so other is a string جو ہم پاس کر رہے ہیں اندر جاکے پہلا کام آپ یہ کہیں کریں کہ جی this کو چیک کریں other کے address کے ساتھ so if this is equal to and other اب دیکھیں ampersand جو and جس کو میں کہا رہا ہوں اس کے بھی overriding والے مطلب آ رہے ہیں کہ جی اوپر جو prototype میں آیا اس کا مطلب تھا other is a reference to string اور یہاں پہ جب ہم نے and other لکھا it means the address of the object called other so a little confusing but again usage کہ جہاں ہم نے string and لکھا ہے تو وہ reference ہے جہاں پہ کوئی data type and operator سے پہلے نہیں آ رہی تو it is the address of operator so now the first test in our assignment is if this equals and other return کچھ نہ کرو foran نکل جاو یہ self assignment کی کوشش ہو رہے ہیں یعنی دو objects ہمیں ملے ہیں پر دونوں کا address memory میں ایک ہی ہے which means it's the same object so we must be careful with this little change in our assignment operator it has suddenly become safe to use so پہلا usage of the this pointer یہ ہوا to check against self assignment اب دوسے use کی طرف چلتے ہیں دوسرا use وہی ہے کہ اب ہم لکنا چاہے ہیں s3 equals s2 equals s1 in other words what we want is کہ یہ اب equal operator کوئی value return بھی کرے اور return کیا کرے back to our definition کہ جب ایک expression ایک assignment statement لے لیں اس نے اگر کوئی value return کرنی ہے تو وہ left-hand side کی value return کرے گا so in this case جب یہ جو ہماری s3 equal to s2 equal to s1 اس expression کا جو right والا half ہے s2 equal to s1 یہ جب execute ہوگا ہم چاہے ہیں جو value s2 میں آئے وہ value expression کی value بن کے واپس ہو so what are we doing how do we return this value well I've already said that ایک assignment کر لی اب ہمارا assignment operator جو ہے equal to operator تھوڑا سے expand ہو رہا ہے سب سے پہلے ہم نے اس میں ایک error checking کر دی کہ جی self assignment نہ ہو اور وہ error checking کی this pointer کے حوالے سے اس کے بعد ہم نے وہی والا پہلہ کام کیا کہ جو ہمارے calling object in this case s2 اس کے buffer کو delete کیا اور اس کے لیے ہمیں کوئی prefix نہیں چاہی ہے کیونکہ calling object is available directly Again یہاں پہ میں لکھ سکتا تھا کہ this arrow buff بہت ضرورت کوئی نہیں ہے buff is the name of the calling objects data member اس کو delete کیا پھر اس کے لیے memory allocate کی new کے ساتھ جس میں s1 کے buffer کی string length لی اور اس میں plus one کر کے memory allocate کی اور پھر string copy کر کے buff میں دال دی اب دیکھیں s2 کے object والا کام ہو چکا ہے اس کے اندر assignment ہو گئی ہے s1 کی value اس کے اندر آ چکی ہے اور اس کی اپنی جگہ ہے ایک بنا ہوا object of type string جو کے پھر equal to assignment operation کی اندر حصہ لیے سکے سو we need to return a string object سو we will say return what return whatever this point 2 return star this how does that work دیکھیں star this کس کو REPRESENT کر رہا ہے s2 equal to s1 کی اندر it's representing s2 the left-hand side والا object جس نے equal to sign کو call کیا تھا so when we say return star this we are saying whatever the object on the left-hand side was اس کو return کر دو as the value of this function so once the assignment operation has been completed that assignment itself has a value and the value is that of the object of the left-hand side so now s3 equal to s2 also works let's look at it again slowly پہلی چیز تھوڑا سا اس چیز کا بھی خیال رکھنا پڑتا ہے کہ یہ call by value ہوگا call by reference ہوگا واپس object بھیجنا ہے کہ reference بھیجنا ہے جب ہم واپس کر رہے ہیں اور ہم چاہے ہیں کہ یہ left-hand side والا object وہی return ہو جائے as the value ایسا دوڑا ہم اس میں جیسے جانتا ہے کہ یہ اس اپس ماندی لذهب اپس اپس اپس اپس اپس رکھا شرط جانتا ہے اللہ پہلے چاہی جانتا ہے اس کے جانتا ہے اپس اپس ایسا از اپس اپس شرط اس کے ساتھ ادر کو چیک کر لیا کہ ادرس برابر تو نہیں ہے تو اگر یہاں کچھ نہ کریں جانتے ہیں آگے جا کے اب ریٹرن بھی دیکھنا پڑے گا یہاں پہنچ کرنا پڑھ جائے گا لیکن پھر ایک چول آسائنمنٹ کی اور پھر کہا ریٹرن ڈار دس سکتے ہیں یعنی کن بھی کچھ چاہتے ہیں سی آوٹ لیس than لیس than آی لیس than لیس than بی لیس than لیس than سی where a b c are any ڈیٹر تائیس آنسا ریز یہاں کرتے آئے ہیں ہم ایک لین میں تین چار چیزیں لکھتے آئے ہیں how did that work جو سی آوٹ کا stream insertion operator ہے which are ڈبل لیس than یہ left associative ہے یعنی پہلے سی آوٹ لیس than لیس than آوپریٹ کرتا ہے اور اس کو آگے اوپریٹ کرنے کے لیے پھر جو ڈبل لیس than لیس than بی لکھا ہوا ہے اس کو left hand side پہ سی آوٹ نظر آنا چاہیے so in a way اس اوپریٹر اوپرلوڈنگ کے اندر بھی جو stream insertion ہے یعنی ڈبل لیس than سائن اس کے اندر بھی return کیا چیز ہو رہی ہے calling object کا reference and in this case it happens to be c out so c out بزاتے خود ایک object ہے اور اس کا reference return ہوتا ہے جب بھی ہم لکھتے ہیں c out less than less than a so اس کا reference آیا تو وہ پھر c out ہی نظر آیا تو وہ less than less than b کام کر گیا اور اس کا reference واپس جو آیا وہ پھر c out آیا اور پھر less than less than c کام کر گیا یہ سارہ کام this pointer کے ساتھ ہو رہا ہے and it is the same thing ہم نے this pointer کے ساتھ بات کی جی value function سے return بھی کی جاتی ہے تو کیا یہ صرف assignment operator کے ساتھ ہم استعمال کرتے ہیں اور operation کے ساتھ بھی کرنے کی ضرورت ہے دیکھیں we had already covered let's take our by now famous date class date کی اندر ہم نے increment operator بھی دیفائن کیا ہم نے plus بھی دیفائن کیا ہم نے plus equal to be دیفائن کیا and so on اور پھر minus بھی کیا minus equal to بھی کر سکتے ہیں you can define all of these جب آپ basic statement کی طرف ہور کریں کہ جناب expression نے value return کرنی ہے so that if you have date objects you should be able to say something like دی2 equals دی1 plus plus یا you could be able to do something like دی1 دی2 یہ date objects ہیں so saying something like دی2 is equal to دی1 plus one so you realize کے جی plus operator کو بھی کچھ value واپس کرنی چاہیے plus plus کو بھی کرنی چاہیے plus equal to be کرنی چاہیے and so on so let us take a look at the date class کا code جہاں پہ یہی operators پھر سے ہم نے لکھے ہیں یہ code جو ہے اس کے اندر اور کوئی زیادہ چینج نہیں آتا except the fact that now it returns a reference to an object of type date ہم date ہی return کرنا چاہے ہیں وہ reference جو ہے ایک تو اس کی function کی declaration لائن ہے اس میں تبدیلی آگئے so we say date and اور پھر آگے date operator plus plus ہو یا plus equal to ہو یا plus ہو equal to itself تو ہم نے ابھی cover کیا string class کیلیے اور پھر اخیر کے اوپر جو left-hand side والا date object ہے اس کا reference بھی return کرنا ہے اور وہ ہمیشہ اسی طریقے سے ہی return ہوتا ہے return star this so it's quite simple whenever you're writing an arithmetic operator اور ہم چاہیں کہ وہ chain statement میں استمال ہو جائے یعنی کسی compound statement کی اندر استمال ہو سکے تو we have to return a value and the easiest way and the most convenient way of returning that value is by a reference to the calling object اب بڑی اسانی سے ہم date arithmetic کی expressions بلکل ویسے لکھ سکتے ہیں جیسے ordinary integers یا floats کی arithmetic ہم لکھتے ہیں so we can write date two is equal to date one plus one یا date two is equal to date one plus plus and so on یا int جو ہے وہ ہم نے difference minus operator تو ویسے int return کیا تھا so that wasn't an issue پر جب بھی object return کرنا ہو اور object وہ والا جو کے left-hand side پہا رہا ہو تو آپ کو return star this statement ڈالنی پڑتی ہے اور یاد رہے کہ declaration کی اندر normally we use a reference ویسے date and پھر اس کا operator کا اپنا نام آجاتا ہے so this pointer is used again and again جیسے میں نے پہلے ذکر کیا جب ہم بات کریں گے ان کلاسز کی یا وہ والے objects جنگ اندر memory allocation ہو رہے ہیں تو پھر this pointer جو ہے اس کے اور مطلب بھی یا اور usages وہ ہم اکٹھی کر کے پھر سے ان کو دیسکس کریں گے آج تھوڑا سا اس کو اب آگے چلتے ہیں اور دیکھتے ہیں اور ہم conversion بگیرا کے اوپر کیا بات کر سکتے ہیں دیکھیں اب back to our ordinary native language ہم کہتے ہیں کہ جی مرے پاس ایک integer i ہے اور ایک float x ہے اگر کہیں پہ میں program میں لکھوں x equal to i تو کیا ہوتا ہے ic language یا c++ automatically integer i کو promote کر دیتے it converts it it converts it into a float whatever the left-hand side was and then does the assignment یاد رہے کے جی operations are quite different integer کی operation ممریک اندر different ہیں float کے different ہیں so you need to do some kind of a conversion same thing happens if you say i is equal to x تو float جو تھا x اس کو convert کیا جائے گا پہلے integer کی اندر اور پھر وہ integer کی value جو ہے وہ i کو assign کر دی جائے گی so conversion happens all the time اگر کہیں پیدا ہے can we do conversion with objects of our own classes اس پر یہ سیسا ہے because if you go to the basic definition we said a class is nothing but a user-defined data type اگر یہ user-defined data type ہے تو اس کے اوپر ہم conversion بھی define کر سکتے ہیں I will give you a classic example suppose date جو ہے وہ ہم نے serial number کے form کے اندر رکھی ہو good so it's now an integer so it's an integer how can it represent a date i'll give you an idea suppose I am کہتے ہیں کہ جی first January of the year 1900 وہاں سے گنٹی شروع کر دو so 1.1900 is day 1 second of January is day 2 third of January is day 3 سو چلتے ہیں چلتے ہیں ایک سدیگ وزر گئی Year 2000 کے اندر کوئی ڈیٹ کا سیریل نمبر آ رہا ہوگا ایک سنگل انٹیجر کافی لنبا جوکہ رپریڈنٹ کرے گا نمبر of ڈیز since a پتکلر ڈیٹ اور اگر آپ اس کو 1st January Year 00 لے لیں تو ایک اسم کا ایک absolute ڈیٹ ریفرنس آپ کے پاس آ جاتا ہے اگر آپ کو اسائد بتاؤن ڈیٹ میں جائیں تو آپ کو یہ سیریل نمبر ملے گا as a ڈیٹ ویلیو وہاں پر ڈیٹ کا ایک سیریل رپریڈنٹیشن بھی ہے which is an integer سپوز کہ ہم ڈیٹ کے اندر بھی اس کی ڈرنل رپریڈنٹیشن month day year نہیں رکھتے بلکہ ایک long ڈیٹ رکھ لیتے ہیں Can I now write something like ایک object ڈیٹ کا ڈیٹ ہے اور ایک integer ڈیٹ ہے can I say ڈیٹ is equal to ڈیٹ now اب آپ کو میں نے problem تو پہلی کھول کے بتا دیا you understand ڈیٹ میں چاہوں گا کہ ڈیٹ کے سیریل نمبر کے اندر چلا جائے لیکن in a way what you want to do is convert the integer ڈیٹ into a ڈیٹ ڈیٹ ڈیٹ جس میں ڈیٹ کا value ڈیٹ کے سیریل نمبر میں چلی جائے اور پھر وہ ڈیٹ ڈیٹ ڈیٹ ڈیٹ ڈیٹ ڈیٹ کا ڈیٹ کو ڈیٹ کو ڈیٹ کو ڈیٹ ہو so you have a concept ڈیٹ جی اب conversion should be possible how can we do it for example with this ڈیٹ ڈیٹ ڈیٹ جس کی ہم بات کر رہے ہیں دیکھیں اگر ہم ڈیٹ کے لیے کوئی constructor ڈیٹ define کر دیں جوکہ ایک integer ڈیٹ لیتا ہو تو c++ ڈیٹ automatically اس constructor ڈیٹ کو ڈیٹ کو ڈیٹ کو ڈیٹ کو call کر لیگی it will automatically call that constructor use the value of the integer i in that constructor and create a ڈیٹ ڈیٹ object اور پھر اندر جو بھی constructor ڈیٹ میں ہم نہیں لکھنا ہے کیسے اس کو serial number کی اندر لجانا ہے but the constructor will return a valid ڈیٹ object اور پھر آگے تو assignment operator ڈیٹ ڈیٹ ڈیٹ ڈیٹ ڈیٹ ڈیٹ ڈیٹ نظر آئے گا assignment ہو جائے گی on the other hand اگر constructor ڈیٹ نہ ہو تو پھر ہم conversion function بھی لکھ سکتے ہیں conversion function ڈیٹ ہم cast occasionally استعمال کرتے آئے ہیں and the way of casting was کہ جیس چیز کو بھی آپ convert کرنا چاہتے ہیں اس سے پہلے cast جو ہے اس کا نام دے دیتے ہیں parentheses کے اندر so for example میں نے اگر x equal to i لکھنا ہے جانx ایک float ہے اور i ایک integer ہے تو I can also write x equals within parentheses float i and that will be the conversion operator نومالی تو یہ ڈیٹ ہوتے ہوتا ہے but sometimes we want to force it اگر ہم نے ایک conversion operator لکھنا ہو جو کیا ڈیٹ ڈیٹ کو لیکھے convert کریں this is not our old date class this is the new one we could write a conversion function function جو ہے وہ date class کا 멤�بر ہی ہوگا it has to be a member it will return nothing because it says that because it's a conversion function. اس کا جو سنتیکس ہے وہ یہی ہوگا کہ جی تیٹ اور آگے empty parenthesis آجائیں گے and that will mean that this is now a conversion function. پھر اس کی body میں آپ جو مرزی لکھیں value جہاں وہ اس کو مل جائے گی and you can define the operator and it will return and it will work like that you will write within parenthesis the name of the conversion operator float لکھنائے انٹ لکھنائے جو بھی آپ کی کلاس کے لیے relevant ہے so conversion functions are quite interesting and they allow us to manipulate objects of different classes for example اب کلاسیز کو تھوڑا سا آگے لے چلتے ہیں ہمارے پاس ایک abstract اسم کی کلاس پڑی ہوئی ہے ایک طرف ٹرک ہے ایک طرف کار ہے ہم کہتے ہیں کہ جی کار کو ٹرک میں کیسے کنورٹ کیا جائے تو we could write a conversion operator which says take a car convert it into a truck and then assign it to an object of tight truck so conversion operations جیس طرح ہم عام لنگوڈ میں انٹیجہs or doubles of floats کو mix کرتے رہتے ہیں we could do that easily let us take a look at a rather comprehensive example جہاں پہ یہ conversion functions استعمال ہوتے ہیں the example i'm going to show you وہ آپ ہینڈوٹس کے ساتھ زیادہ اس کو refer کریں کیونکہ کوٹزرا سا لمبہ ہے لیکن example جو ہے وہ ہے کلاس فریکشن کا now why a class called fraction پہلے تو اس کی کو justification ہونی چاہیے دیکھیں what about a fraction of the type 1 over 3 1 over 3 کو اگر آپ کمپوٹر کی ممری میں store کریں گے دو تین چیزیں ہوں گی it will be stored as let's say a double precision number ہم کہتے ہیں x equals 1 over 3 پہلی چیز کی جی 1 over 3 store کرنے کا کوئی طریقہ نہیں ہے so it actually does a division of 1 divided by 3 double precision division اور وہ 0.3333333 اس کی value آتی ہے اور کتنے 3 لگتے ہیں depend کرتا ہے کہ جی double precision number کیلئے ممری میں جگہ کتنی چھوڑی ہوئی ہے that value is assigned to a double variable so what happens جب میں اس دول ویریبل کو لیکے تین سے زرب دے دیتا ہوں if i say 3 times x where x was equal to 1 over 3 جو آپ کیا آئے گا well you can see what the answer is answer will be 0.99999 whatever the number of digits was problem is 1 over 3 multiplied by 3 is 1 it is not 0.999 so پہی دفعہ یہ problem آتا ہے کہ جی ہم exactly represent کرنا چاہتے ہیں نمبرز کو fraction class اس طرح کی کلاس ہے جہاں پہ ہم numerator اور denominator دے دیتے ہیں object کو اور وہ علیدہ علیدہ ہی ان کو رکھتا ہے it will always keep them as an integer numerator اور an integer denominator and then we can do all kinds of arithmetic with it obviously class is long but you can see کیا بندر اگر one علیدہ سے ستور کیا بہت ہی اور 3 علیدہ سے ستور کیا بہت ہی ایک object کی اندر اور میں کہوں کہ جی ان دو objects کو add کرو how do we add them well by now we have enough tools at our disposal the tools are we can overload the addition operator now I can take 1 over 3 as او جو arithmetic میں ہم in a fraction لکھتے ہیں اور اس میں جمع کرلو میں 2 over 5 and I should come up with another fraction which is numerator and denominator without having to worry about the round off errors the truncation the conversion of integers into double precision ایسیٹرہ وہ ساری وریز ختم ہو جاتی ہیں یہ تو ایک ہمارا ماثمیٹیکز میں سے ایک سامبل تھا کوئی real world میں سے ایک سامبل آپ کا خیال آتا ہے دیکھیں what happens if we are dealing with currency banks جو ہیں وہ دن رات currency کے ساتھ کان کرتے ہیں اور currency جو ہیں وہ ہم computer programs میں deal کر رہے ہوتے ہیں بھی کس کے اکاونٹ کا کتنا balance ہے اس پے کتنا profit لگانا ہے اس میں سے کیا چیز ویدروہ ہوئی ہے اس میں کیا deposit ہوئے ہیں لیکن اگر bank کہے آپ کو کہ جی اس سال ہم نے profit declare کیا ہے 3.76% تو آپ کے bank account میں جتنے پیسے پڑے ہوئے ہیں اس کا 3.76% اگر calculate کریں تو کیا وہ exactly rupees and pesos کے اندر پورا آئے گا یا dollars and cents کے اندر پورا آئے گا یا نمالی ہماری currencies ہی 2 decimal digits after the decimal point and whenever we apply some kind of rates in percentages وہ ملتیپلکیشن یا division کا رزال چو ہے وہ 3-4 decimal places بن جاتا ہے in order to maintain accurate currency computations you don't want banks cannot afford کے جی 9 روپے اور 10 پیسے کے اندر 9 way پیسے جمع کریں تو وہ 10 روپے اور 1 پیسے بن جارے ہیں they can't afford that it has to be accurate arithmetic so they do not rely on programs that use something like double precision numbers to represent currencies they would rather have written in the program کہ اس کو string کے طور پہ ٹریٹ کرو 9 is a string 1 0 is a string or string additions ڈیشنز ڈیشنز ڈیفائن کرو کہ جی point 1 0 or string additions ڈیشنز ڈیفائن کرو کہ جی point 1 0 کے اندر point 9 0 those strings کو add کریں تو it should result in 1 point 00 so there are lots of interesting things that happen in the real world اور وہ ہمیں force کرتا ہے as programmers to program things differently so we don't use native data types again as a little bit of history cobalt purani language but it was a business oriented language عاد ہے common business oriented language اس کے اندر یہ فیصلیتی تھی that you could represent decimal numbers exactly اور انٹرنلی وہ اسی طرح کر رہا ہوتا کہ strings رکھی ہوئی ہیں اور اس کو اگر میمری میں دیکھو تو پوری string نظر آتی تھی کوئی artificial computer representation of numbers نظر نہیں آتی تھی یہاں پے پورا آگے آکے evolution ہو گئی نئی languages آگیں but اب ہمارے پاس وہ facility آگئی ہے اب ہم language کو نہیں دیکھتے ہم کہتے ہیں اس language نے ہمیں facility اتنی دے دی ہے کہ اگر آپ کی کوئی SPECIFIC requirement ہے میں اس کسم کی data type آپ کو لکھ دیتا ہوں so if you think of fractions that was one specific data type that we might want to create to store the numerator and the denominator separately and never lose precision in arithmetic calculations same thing applies to objects like currency we could store the whole number part and the fractional part both as separate integers and never lose accuracy but whenever we get into these classes then it is our responsibility to start writing all of the operators that are required and that makes a complete class شروع ہم نے discussion کی تھی conversion function سے اگر fraction کو لیا جائے you can think of a constructor which is ایک انٹیجر لیتا ہو اور اس کو fraction بنا دے ایک انٹیجر سے fraction کیسے بنے گا دیکھیں پہلی چیز as a fraction ہم نہیں چاہتے کہ کوئی چیز بھی one over zero ہو جائے یا one anything over zero نہ ہو ایسا fraction ہمیں deal کرنا نہیں آتا so ہم یہ کرتے ہیں کہ جی اس کا ایک default constructor جو دیتے ہیں وہ دو انٹیجر لیتا ہے ایک نیوم ریٹر کے لیے اور ایک دینومنیٹر کے لیے لیکن دینومنیٹر کو ہم ایک default value بھی دے دیتے ہیں equals one so that means کہ اب آپ ایک fraction کنسٹ کر سکتے ہیں by passing it a single integer in which case it will be represented as وہ سنگل انٹیجر جو پاس ہوا وہ نیوم ریٹر ہوگا اور جو default value ہے دینومنیٹر کی وہ one اس کے ساتھ مل کے ایک fraction بن جائے گا کیوں میں اس کنسٹر کی بات کی اگر ہمارے پاس fraction ایک object ہو f اور میں لکھوں f equals 3 what will happen is that automatically this constructor will be called which takes a single integer as an argument an object of type fraction will be created and the assignment carried out in a way this is nothing more than the conversion operation the conversion of an integer into a fraction so you can write your own conversion operator or you can use a single argument والہ constructor وہ بھی conversion کا کام کرے گا you can't use both you have to write one or the other so you have to be care for anyway conversion functions I suggest کہ جو آپکو کوڈ اگزامپل دیا گیا ہے اس کو آپ اچھی طرح سٹڑی کریں اور اس کے اندر سے پکاپ کریں کہ جی conversion functions کیسے لکھے جاتے ہیں ان کے rules regulations کیا ہیں online بھی آپ کو جو لیکچر مٹریل دیا گیا اس کے اندر بھی ان کی values دی ہوئی ہیں