 اسلام علیکم، آج ہمارا لیکچر نمبر 31 ہے CS201 انٹردکشنٹو پروگرامنگ آج کا ہمارا topic جو ہے وہ ہے اپریٹر اوبرلوڈنگ پسلی دفعہ ہم نے کچھ اس کے بارے میں بات کرنے شروع کی تھی اور ریفرنسز کا topic انٹردوز کیا تھا اور میں نے کہا تھا کہ جی ریفرنسز استعمال ہوتے ہیں جب ہم اپریٹر اوبرلوڈنگ کی بات کرتے ہیں آج ہم اپریٹرز کو دیکھیں گے جو سی پلاس پلاس کے سٹینڈڈڈڈ اوبریٹرز ہیں اور دیکھیں گے اوبرلوڈنگ کی ضرورت کیوں پیش آتی ہے کنسی سیچویشن ہے جہاں پہ ہم اپریٹر اوبرلوڈنگ کرنا چاہتے ہیں اور ساتھ کیوں کہ یہ تقریبا وہی لو لیوڈنگ لینگوڈ جو سی تھی یہ اسی کی ایکسٹینشن ہے آپ اپریٹر اوبرلوڈنگ کیسے آپ غلط کام بھی کر سکتے ہیں اور ان کو اوبرلوڈنگ کیسے کرنا چاہی ہے پھر ہم کچھ اس کے سنٹیکس کے بارے میں دیکھیں گے اور دیکھیں گے کہ یہ اوبرلوڈنگ actually function کے فرم میں لکھی جاتی ہے اور پھر ہمیوڈنگ سکتے ہیں اور ہمیوڈنگ جو اوبرلوڈنگ کے ساتھ اوبریٹرز تو آئے آج کے topic آگاز کرتے ہیں اور دیکھتے ہیں کہ اوبرلوڈنگ کیا ہوتی ہے اور ہم اس کو کس طرح سے استعمال کرتے ہیں دیکھیں اوبرلوڈنگ کا مقصد یہ ہے کہ جو ہمارے standard built-in اوبریٹرز ہیں جیسے plus minus multiply divide ان کے لیے ہم کوئی اور مطلب جو ہے وہ بھی تجویز کر سکیں the idea is as follows جب ہم دو انٹیجرز کو ایڈ کرنا چاہتے ہیں تو ہمارے پاس simple plus اوبریٹر ہے اور ہم انٹیجر i اور j اگر ہیں تو i plus j لکھ لیتے ہیں لیکن جب ہمارے کلاسز اور ان کے objects کی باری آتی ہے تو we certainly realize کہ جو c plus plus کے built-in اوبریٹرز ہیں وہ ہمارا کام نہیں کرتے ان کے لیے ہمیں کوئی اپنے functions لکھنے پڑتے ہیں میں نے پہلے بھی ذکر کیا تھا let's take a case of complex numbers now complex number آپ کو پتا ہے اس کے دو حصے ہوتے ہیں ایک real part ایک imaginary part اور complex numbers because they are part of our mathematical vocabulary ہم ان کو add بھی کرنا چاہتے ہیں subtract بھی کرنا چاہتے ہیں and so on we want to do mathematical manipulations لیکن اگر ہم اپنی complex number class لکھیں تو اس کے ساتھ ہم اگر ہمار پاس ایک complex c1 اور c2 دو variables ہوں تو ہم ابھی تک c1 plus c2 نہیں لکھ سکتے اس کے لیے اگر دو complex numbers کو ہم جمع کرنا چاہیں تو ہمیں کیا کرنا پڑتا ہے ایک function لکھنا پڑتا ہے کوئی بھی اس کا نام دے دیں c add دے دیں c add اور پھر اس کو دو complex numbers ہم پاس کریں گے وہ ان کو جمع کرے گا اور result کو واپس کرے گا کام تو یہ ہم کر سکتے ہیں by writing functions but the usage is very clumsy بڑا awkward قسم کی usage ہے کہ آپ x equal to a plus b نہیں لکھ سکتے آپ کو لکھنا پڑتا ہے x is equal to c add a comma b اور وہی بات کہ اگر ہم وہی numbers کی بات کر رہے ہیں اگر ہم a plus b plus c لکھنا چاہیں تو اب کیسے کریں گے اگر یہی c add والا ایکزمپل لے لے تو ہمیں لکھنا پڑے گا x is equal to c add parenthesis open پھر c add a comma b پھر parenthesis closed comma c parenthesis closed تو آپ ہماری notation ہے وہ بڑی جلدی complex اور cumbersome ہوتی جاتی ہے ہماری more natural use of these operators ہم لکھنا چاہیں گے کہ جو بھی ہماری class ہو especially اگر mathematical class ہے تو ہم چاہیں گے جو mathematical built-in functions ہیں ان کو ہم استعمال کر کے ان کا نیا مطلب جو ہے وہ استعمال کر سکے question is when is operator overloading relevant پہلی چیز جہاں پہ بھی mathematical functions آتے ہیں it is very relevant کہ جی ہم complex number کا میں آپ کو اگزمپل دیا اور بھی چیزیں ہو سکتی ہیں جہاں پہ ان کی relevance آتی ہے for example ہم ایک class جہاں سے شروع کیا تھا ہم نے ایک date class استعمال کی تھی وہ ایک object create کیا تھا of type date اس کے اندر month day year تھا now as human beings ہمیں پتا ہے کہ جی اگر میں کہوں کہ دو دن بعد یہ کام کرنا تو آپ mentally کر سکتے ہیں یہ اپنا not book کھولیں گے اور دو دن کے بعد date دھوندیں گے اپنی دیاری میں اور وہاں کاتہ لگا دیں گے کہ جی یہ کام کرنے والا ہے now what we've done is we've added to today's date now it's again a mathematical operation but it's on a different type of object it's often it's to an object of type date کے we are adding یاگر میں کہوں تین دن پہلے یہ کام ہوا تھا so you can actually do mental arithmetic or you can look up your diary and say کہ جی تین دن پہلے کیا date تھی اور اس دن کیا کام ہوا تھا یا تین دن کے پہلے اخبار دیکھ لیں so there is arithmetic that we do with other objects as well which are not mathematical in nature لیکن کچھ manipulation کیلیے numbers استعمال کرتی ہیں مکلاسز date is an example پھر ایک ایک اگرامپر لے لیں strings اب strings ہم کرتے آئے ہیں استعمال کرتے ہیں پھر ہم نے وہ header class تھی string.h اس کو بھی استعمال کیا تھا اور دیکھا تھا کہ یہ اگر دو strings کو جوڑنا ہو تو ہم string cat function استعمال کرتے تھے concatenation of two strings اور پھر اس کے باقی manipulations بھی تھی لیکن کیا ہی اچھا ہو کہ ہم دو strings کو add کرنے کے لیے یعنی دونوں کو اگر اس طرح سے ہم جوڑنا چاہتے ہیں تو plus operator استعمال کر لیں تو we should be able to write s1 plus s2 where s1 and s2 are strings so there are usages for these operators which make the program more easy to read and more easy to understand but simultaneously as I always say there's a cost cost کیا ہے basic cost یہ ہے کہ یہ operator overloading ہو رہی ہے یعنی ایک ہی operator کے کئی مطلب ہم بنا رہے ہیں لیکن overloading کا طریقہ ہمارے پاس وہ ہی ہے جو اب تک ہم سیکھ چکے ہیں یعنی ایک function لکھنا ہم نے جب ہم function لکھنے جاتے ہیں تو تھوڑی سی تو اس پر restrictions ہیں کہ جی وہ کس طرح سے call ہوگا لیکن function کے اندر کیا لکھنا ہے that's totally up to us as programmers we can write whatever we want in a function تو اگر آپ بہت ہی confusing program لکھنا چاہتے ہیں تو آپ ایک operator plus define کر سکتے ہیں جس کے اندر جاکے آپ دو نمبروں کو subtract کر رہے ہیں now that would be of course totally confusing but there is nothing syntactically wrong with the program program اس طرح سے لکھ ہوا بھی compile بھی ہوگا چلے گا بھی so we have to be careful with the freedom that we are buying کہ دی اس کے ساتھ responsibility بھی آ رہی ہے اور was responsibility یہ ہے کہ ان کا correct usage ہو جو obvious meaning ہو اس کسم کا usage استعمال کرنا چاہیے in operator functions کے لیے اب let us take a look at what operators can we overload overloading کی operator کی اب list آپ دیکھ رہے ہوگے it's a comprehensive list which means essentially any and all operators جو کے c++ میں موجود ہیں ان کو ہم overload کر سکتے ہیں اور exceptions بڑی تھوڑیسی ہیں وہ tertiary operator ہے جو تین argument لیتا ہے اس کو ہم overload نہیں کر سکتے اور چند اور ہیں جو کہ آپ کو handouts میں بھی مل گئے ہیں اور یہاں پہ بھی آپ دیکھ رہے ہیں let us start with some simple ones and see how the mechanism of operator overloading works اس کو سمجھنے کے لیے کہ جی operator overloading کا mechanism کام کیسے کرتا ہے we have to step back a little bit and think in terms of کہ جی operators کے دیتا ممبر کو ہم ہاتھ لگاتے کیسے ہیں دیکھیں اگر operator اگر operator کو بھی چھوڑ دیں ہم کہیں کہ جی ہمارے پاس ایک date object ہے اور اس کا member جو ہے data member day ہے تو day کو اگر ہم استعمال کرنا چاہیں کسی function میں اور اس پیشلی اگر وہ کوئی member function ہے جو کہ private data section کو دیکھ سکتا ہے تو ہم دیکھتے ہیں object dot اور پھر variable کا نام in this case day so object جو ہے وہ left side پہ آتا ہے dot operator کیا اور وہ drive کرتا ہے کہ جی اس object کا فلانا والا حصہ اگر آپ operators کے perspective سے دیکھیں تو جب ہم لکتے ہیں a plus b تو اب plus کے بھی دو چیزیں وہ partecipate کر رہی ہیں اس addition کی اندر the question is کہ plus کو drive کن کر رہا ہے یعنی کنسی چیز ہے چو کہ force کر رہی ہے plus go to act in a certain way the answer is جو left side پہ چیز آتی ہے وہ operator کو drive کرتی ہے جس طرح میں نے date object لیا or date dot day کہا تو date drive کر رہی ہے کہ جی اس کا member function ہے یا member variable ہے اسی طریقے سے a plus b میں a drive کرتا ہے کہ جی plus کنسا والا استعمال ہوگا جب میں نے بات کی کہ جی operator overloading ہے it is very very similar to function overloading it means exactly that جی جو function overloading کا rules تے وہی operator overloading پے apply کرتے ہیں یعنی you cannot overload the plus operator by saying کہ جی دو مختلف قسم کے ہم نے plus operator لکھیں لیکن ان کے arguments جو ہم وہ بالکل identical ہیں they have to be different number of arguments and the type you can or rather or the type کوئی difference ہنا چاہیے operator کی prototype کی اندر لکھتے کیسے ہیں بہت سمپل ہے نیا کیورڈ ہے operator operator overload کر رہے ہیں so it is obvious کہ the operator is the new keyword so we will write exactly like a function کہ function کوئی چیز return کرتا ہے تو پہلے return type آئے گی operator کی پھر آئے گا keyword operator اس کے بعد operator کا سیمبل آئے گا in this case ہم دسکس کر رہے ہیں plus کو تو ہم plus کا سیمبل لکھیں گے اس کے بعد parentheses کے اندر اس کے argument list آجائے گی و پھر نیچے ہم اس کی body define کر دیں گے کیسے اس کے اندر کرنا کیا ہے before we get into the exact examples let's talk about some general guidelines general guidelines جو ہم operators کی وہ یہ ہیں کہ اگر کوئی آپ کے پاس binary operator ہے in this case plus plus ایک ایسا operator جس کو دو argument چاہیں a plus b a اور b چاہیں جن کو وہ جمع کرے گا تو آپ اس کے جب نئی اپنی overloading کا لیے definition لکھتے ہیں تو وہ operator unary نہیں بن سکتا in other words اس کی arity کہ یہ unary operator ہے یا binary operator ہے وہ وہی رہے گی it will either remain a unary operator or it will remain a binary operator depending on کہ c plus plus میں جو native operator اس کی arity کیا تھی اسی طریقے سے ہم کوئی نیا operator ہی جاد نہیں کر سکتے so fortranic language ہے جو بڑی popularity ہے scientific circles میں for scientific computation اس کے اندر ہم کرتے تھے کہ دو stars کا symbol استعمال کرتے for raising a number to a certain power so you said x star star a which meant x raise to the power a c or c plus plus میں کوئی star star operator نہیں ہے لہذا ہم کوئی اپنی طرف سے star star operator define نہیں کر سکتے ہم صرف وہی operators کو overload کر سکتے ہیں جو کہ native language کے اندر موجود ہیں پھر دیکھیں کہ جو native operators ہیں یعنی ہم integers کو add کرتے ہیں تو plus جو ہے وہ دو integers پر act کر سکتا ہے integers are native knows how to act with these native data types we cannot overload the operation of adding two integers وہ ہم نہیں کر سکتے ہیں we cannot replace the basic definition of the language nonetheless ہم اپنی data types کے اوپر overloading کر سکتے ہیں what that really means is ہم operators کو overload کریں گے so back again let's just recap you cannot introduce new operators you have to use the list that comes with the language or only ہم overload کر سکتے ہیں overload آپ native data types کیلئے نہیں کر سکتے ہیں یعنی جو definition نمو یعنی جو جیسے یہاں ہم باہر کیلئے ہم بنت فارغ اس کو ہم بنت فرمیENA ہم خلاف ہم خلص ہم پر ملٹیپکیشن کیا بہت نظر than دا بہت رہا ہے۔ پہلے یہmake آنڈار بڈیٹٹٹ کیا بھئی ہے Yesterday بہت نظر اسٹار بڈیٹٹٹٹٹر بہت نظر نہیں ہے لیکن بہت نظروں کے بہت نظر ہی ہے لیکن بھی ایک اٹنی اٹنی دینی ہے بھی نظر کیا جیسے میں بھی رہنا ہے ۔ ۔ اسے جب لیکن اسی ایک سب سے بہت نظر کیا بہت نظر کیا۔ اس کے لئے ہم ایک پلس اوپریٹر دیفائن کرنے چلتے ہیں۔ before we even get there, there are several decisions and several things that we need to understand. پہلی چیز یہ ہے کہ جی آپ پلس کا اوپریٹرشن کو ذرا سے سمچھیں۔ جب ہم کوئی ordinary لائن لکھتے ہیں، x is equal to y plus z. جناب پہلے تو یہ سوال آتا ہے کہ جی y میں کوئی تبدیلی ہوتی ہے۔ z میں کوئی چینج آتا ہے، x میں کوئی چینج آتا ہے۔ what happens? so you have to be very clear in your mind how you want the operator to behave. you understand that when we write y plus z تو y and z are participating in the addition operation تھیکہ وہ حصہ تو لے رہے ہیں لیکن نہ y کی ویلی میں کوئی تبدیلی آتی ہے، نہ z کی ویلی میں تبدیلی آتی ہے۔ this is a concept کہ جی اگر آپ سمجھ لیں گے تو پھر آگے جب اپنے اپنے اوپریٹر لکھنے جائیں گے تو آپ کوشش کریں گے کہ یہی بیحیویر اس اوپریٹر میں قائم رہے۔ اس کے بعد z کو کیا؟ مطلب ہم کہتے ہیں x is equal to y plus z تو x کو کیا ہوتا ہے؟ جو بھی y plus z کی addition کی اس کا جو رزلت آیا وہ x کو ایسائن ہو جائے گا لیکن یاد رہے وہ پلس کا ایکشن نہیں ہے وہ تو assignment operator جو ہے equal to اس کا ایکشن ہے so we have to keep in mind کہ جی رزلٹ آئے گا کیا؟ پھر اس کے ساتھ کرنا کیا ہے؟ ایک تو یہ چیز دوسی چیز assignment operator کو بھی ہم ساتھ دسکس کرتے چلتے ہیں assignment operator is very common I mean equal to sign تو ہم ہر جگے پہ ہر لین پہ استعمال کر رہے ہوتے ہیں جب ہم دو اپنے objects لے لیتے ہیں جب ہم دو اپنے objects لے لیتے ہیں complex c1 or c2 دو complex objects ہم نے define کیے جب میں کہتا ہوں c1 equal to c2 تو ابھی تو مجھے پتہ نہیں ہے کہ جی equal to operator کیسے define کرنا ہے تو کیا یہ syntax error ہوگا؟ آپ try کر کے دیکھے you will find it won't be a syntax error it will work why does it work it works because c++ provides a default assignment operator to every class that you develop now how does that assignment operator works یہ simply member by member کوپی کرتا ہے چیزوں کو ہماری جو complex class ہے بڑی سیمپل ہے اس کے دو دیٹا ممبرز ہیں جوکہ private section میں ہم نے رکھے ہوئے ہیں they are both of double type اور ہم کہہ دیتے ہیں and double real and double image short for imaginary تو دو اس کے دیٹا ممبرز ہیں اگر آپ کے پاس یہی دو variables ہیں of type complex c1 and c2 اور آپ کے پاس آپ لکھ دیتے ہیں c1 equal to c2 تو کیا ہوگا؟ by default c2 کا real جو ہے وہ c1 کے real کو ایسائن ہو جائے گا c2 کا image جو ممبرز دیٹا ہے وہ c1 کے image کے اندر اسائن ہو جائے گا this is a default operation that c++ provides you problem کہاں آتا ہے problem اس جگے پہ آتا ہے جب ہماری کلاس کے اندر کوئی دیٹا ممبر جو ہے وہ pointer ہو اور pointer جو ہے وہ کسی memory میں کسی جگے کو point کر رہا ہو اب جو member by member copy ہوگی وہ pointer کی value copy کر دے گی لیکن دیٹا نہیں copy ہوگا so we have to be careful لیکن اس کو ہم بعد میں کسی وقت دیسکس کریں گے ابھی ہم simple plus operator کے اوپر رہتے ہیں ایک میں نے بات یہ کی کیجی plus کا behavior آپ understand کر لیں کیجی جو دو entities جو ہے یا دو complex numbers plus یا addition operation کے اندر participate کر رہے ہیں ان کو کچھ نہیں ہوگا لیکن اس کا جواب کیا آئے گا اس کا جواب ایک complex number ہی ہونا چاہی ہے by the definition of complex numbers and their additions we know کیجی جب دو complex numbers کو ہم add کرتے ہیں تو ان کے real parts جو ہیں وہ alaida سے add ہوتے ہیں اور imaginary parts جو ہیں وہ alaida سے add ہوتے ہیں جو result آتا ہے نیا ایک real جو کہ it is the sum of the two real parts and the imaginary which is the sum of the two imaginary parts this real and imaginary make up a new complex number ہم چاہتے یہ ہیں کہ ہمارا plus operator اس نئے complex number کو return کرے میں نے پہلے بات کی تھی کہ operators are nothing more than functions if they are functions they do and normally have a return value in this case the complex plus operator it will return a number of type complex دوسی چیز جو آتی ہے وہ یہ ہے کہ جی یہ جو operator ہے یہ member operator ہوگا یا friend ہوگا یا non-member ہوگا اس کے لیے بھی ہمیں کچھ decision لے نے پڑتے ہیں normally ہم operators ان کو member operators بناتے ہیں لیکن یہ لازمی بھی نہیں اور کئی جگہ ایسی ہے جہاں پہ وہ member ہو بھی نہیں سکتے let us take a look کہ جی member operator کے لیے کیا کیا ہمیں چیزیں چاہی ہیں پہلی چیز کہ اگر وہ member operator ہے پہلے ہم prototype کی لائن دیکھ لیتے ہیں return type complex آگے keyword operator آگے operator کا اپنا symbol in this case plus اس کے بعد اس کی argument list اگر یہ member operator ہے تو اس کو drive کرنے والا پہلی بھی بات کی ہے جو left side پہ object of type complex وہ drive اس کو کر رہا ہوگا کیونکہ یہ member ہے تو جو object plus sign کے left side وہ اس کو drive کر رہا ہوگا وہ object کیونکہ drive کر رہا ہے اس کو وہ push کر رہا ہے وہ اس کو call کر رہا ہے تو plus operator کو automatically اس object کا تو پتا ہے اس کے اندر بھی ایک this pointer کی بات آتی ہے لیکن اس کو ہم بعد میں دیسکس کریں گے ابھی کے لیے اتنا کافی ہے کہ آپ سمجھ لیں کہ plus کے left hand side والا complex number ہے plus operator کو اس complex number کے بارے میں سب کچھ پتا ہے اور کیوں کہ ہم ابھی plus کو member operator بنانے جا رہے ہیں لہذا اس کو اس کے real and imaginary parts بھی نظر آ رہے ہیں which are normally private data on the other hand جو right side پر number آ رہا ہے which is the second complex number it is now an argument which is being passed to this complex operator so back to our prototype the prototype becomes complex یہ complex number return کرے گا complex operator plus or parentheses کے اندر complex ایک number اس کو ایک complex number گا left والا number تو بزاتِ خود وہ ہے جو اس کو call کر رہا ہے so ایک member operator اور plus کیوں کہ binary ہے so as a binary operator جب وہ member operator کے طور پی ہم دیفائن کرتے ہیں اس کو ایک argument pass ہوتا ہے اور جو دوسرا number وہ plus operation میں جو participate کر رہا ہے وہ بزاتِ خود اس کو call کر رہا ہوتا ہے اب اس کی definition کی طرف آتے ہیں پہلے تو آپ یہ definition دیکھ لیں میں ایک دفاع اس کو کر دیتا ہوں پھر اس کو line by line expose کرتے ہیں کہ یہ کر کیا رہی ہے تو پہلے لین تو آگی function کا اپنا نام so we say complex operator plus پھر parentheses کے اندر complex c braces کھولے complex temp ایک ہم نے complex number declare کیا اس operator کی اندر next line temp.real equals real plus c.real پھر ہم نے کہا temp.image equals image plus c.image پھر ہم نے کہا return temp braces ختم کیے operator define ہو گیا اب درہ دیکھیں اس کو سمجھنے کی کوشیس کرتے ہیں line by line پہلے تو آجن definition کی طرف ہم نے کہا جیس کی return type is a complex number اس کے بعد یہ operator ہے operator کا symbol ہے plus اس کو pass کیا کیا کیا ایک complex number جس کا نام ہے c this is how we write the prototype or the opening line of the definition اب اندر جاکے ہم نے سب سے پہلے ایک complex number declare کیا which is local to this operator remember it's just a function we're just writing a function so we can do whatever we want inside whatever is legal it's a return temp دیکھیں میں نے already mention کیا جب دو numbers ایک addition operation کیا اندر act کرتے ہیں تو دونوں نمبروں کو کچھ نہیں ہوتا ان کا جو some ہے وہ some ہم نے return کرنا ہے یہ temp یہ a complex number ہے جو two complex number کا some لیکے return کرے گا to the next لیکے so یہ نمبر جو temp ہے اس کا real پارٹ کس کے برابر ہوگا یہاں پہ ہم نے لکھا ہے temp.real equals real plus c.real سی جاتی ہے یہ تو ہم نے argument list میں ایک number اس کو بھیجاتا complex c تو c.real جو ہے وہ c کا real پارٹ یہ as mentioned earlier کہ left side پی بھی plus side کے plus sign کے left side پی بھی a complex number بیٹھا ہوا ہے وہ اس کو call کر رہا ہے جو نمبر اس کو call کر رہا ہے اس کا دیتا تو سامنے available ہے اس کے لیے ہمیں کوئی اس کا object نیم دینے کی ضرورت نہیں ہے so یہ جو real اکیلہ لکھا ہوا ہے یہ calling object کا real حصہ ہے so temp.real equals calling object کا real part plus جو ہم نے object اس کو pass کیا جو plus کے right side پہ لکھا ہوا ہے c اس کا real part so c.real and the next line is the same temp.imaginary یہ جو ہمارا temporary complex number locally ہم نے define کیا operator میں اس کا imaginary part will be calling number کا imaginary part which means the number on the left hand side of the plus sign plus c.image the imaginary part of the complex number which is on the right hand side of the plus sign اب ہمارے پاس temp جو ہے وہ complex number پورا construct ہو گیا اس کا real or imaginary part define ہو گئے ہیں اس number کو ہم واپس کر دیں گے so we return temp that means this complex operator is now returning a complex number by value یہ یاد رکھئے یہ value ایک return ہو رہی ہے اب آپ لکھ سکتے ہیں اس کے سم کی لائن because z is equal to x plus y جہاں پہ z, x اور y تینوں جو ہے وہ complex number ہیں تھوڑا سا اس کو پھر آپ غور سے دیکھیں اور سمجھ لیں x plus y کے اندر اب یہ operator plus جب call ہوگا تو x call کرنے والا number ہے so that is the number جس کا real or imaginary operator کے اندر qualify نہیں ہو رہے اور دوسر number جو plus کے right پر ہے وہ y ہے تو c.real یا c.image جب لکھ رہے ہیں وہ y کے real اور imaginary part سے ان دونوں کو جمع کر کے ہم نے ایک complex number temp کریٹ کیا جو کے by value return ہو رہا ہے جب وہ return ہو رہا ہے تو equal to z is equal to کو ایک complex number نظر آتا ہے وہ complex number as I mentioned earlier equal to وہ default operator c plus plus آپ کو Provide کر دیتی ہے جو member to member کوپی ہو جاتا ہے یعنی جو بھی complex number آپ کے پاس واپس آیا temp temp کا نام equal to sign کو نہیں پتا اس کو simply ایک complex number structure ملتا ہے اس کا real part z کے real part میں آسائن ہو جائے گا اس کا imaginary part z کے imaginary part میں آسائن ہو جائے گا end of story it works quite simple quite elegant now you can write your complex addition like this any problems well not with this definition this definition is fine it works but what happens اگر میں 2 complex numbers کی بجائے ایک complex number اور ایک double number کو add کرنا چاہوں سوچیں اس کا کیا مطلب ہوگا well we can either decide our own definition نے بتا ہے freedom بڑی ہے I can define an addition of a double number with a complex number as کیونکہ real number ہے لہذا یہ complex کے real number میں add ہوگا imaginary میں add نہیں ہوگا so definition تو آسان ہو جاتی ہے کہ اب ہم اس کو overload کر دیتے ہیں operator کو پھر بھی ہم member ہی رکھتے ہیں اب ہمارے جو the line that we are trying to implement is z is equal to x plus d جہاں پہ z or x وہ complex numbers ہیں لیکن d جو ہے وہ double number ہے and it's a real double number اس کی جب میں definition لکھنے جانگا as a member operator return type complex مجھے complex number ہی چاہی ہے جواب میں operator plus لیکن اب pass اس کو ہو رہا ہے double d تیک ہے اب اس کا parameter بدل گیا اس کی argument list بدل گی ہے it's a legal overloading of the operator اب آپ کے program جب لکھے گا z is equal to x plus y اور x اور y دونوں complex number ہیں تو پہلے والا plus operator call ہو گا آپ کا اگر program جاکے لکھے گا z is equal to x plus d where d is a double precision number تو یہ دوسی والی definition call ہو گی automatically by the rules of overloading so in that sense operator overloading and function overloading are very similar to image ختم اس کے اندر کوئی چیز جمع نہیں کرتے return temp operator defined یہ ہم نے دو operators define کر لیے دونوں plus ہیں چلے تیسری کی طرف چلتے ہیں what happens اگر میں لکھنا چاہوں d plus x اب میں کہہ رہوں ایک double precision number کو ایک z is equal to d plus x where z is a complex number d is a double precision number and x is a complex number the problem جو یہاں پہ آ رہا ہے وہ یہ ہے کہ جی plus operator کو drive کرنے والی کونسی چیز ہے کیا شاہ لہا کونسی چیز ہے is اگر ایک double precision number operator کو call کر رہا ہے تو obviously double precision number or complex number میں تو فرق ہے a double precision number is not a complex number so it is not a member of our complex class if it is not a member of our complex class this can be and can be but it is not a member of our class have we covered something like this I think we have it is called a friend function so here is a usage of a friend operator کہ اب آپ کو member operator نہیں بنانا آپ کو friend بنانا ہے جب اس کی driving side which means the left hand side of the binary operator وہ class کا member not اور ہم چاہیں کہ جی behavior وہی ہو الحسن کرنا پڑے گا but not with a member function but with a friend function کہ اب دکھیں پلاس کی definition ہی چلتی جا رہے ہے پہلا پلاس دو complexbern로rew کو جمع کیا member function member operator function دوسرا پلاس complex کو double precision کے ساتھ جمع کیا لفتنج complex number دبالا They Add لیکننی a member function a complex number is driving the addition operation تیسری دول پرسیشن پلاس کمپلیکس نمبر ، now the driver is different it's a double precision number cannot be a member has to be a friend اسی اجامپل کو لے کے زراہ سا رکیں اور پیچھے دیکھیں کہ ابھی تاک جو ہم پرگریمن کرتے آئے ہیں اس کے اندر کیا ہوتا رہا ہے we have been adding integers i plus j no problem we've been adding doubles and integers ہو بھی ہم کر چکے i plus d d plus i result کیا آتا تھا دپنٹ کرتا تھا کہ جی ہم اس کو استعمال کیا کرنا چاہتے ہیں اگر آپ سوچیں تو آپ کو پتہ چلے گا کہ جنا پلاس سیمپل پلاس اپریٹر جو ہے وہ بزات ہے خود already overloaded دو انٹیجرز کو جمع کرنے کا طریقہ different ہے کمپائلر یا کمپلٹر کے اندر اس کے لیے ایک خاص version of the plus اپریٹر کال ہوتا ہے دو دوبل پرسیجن نمبرز کو جمع کرنے کے لیے ایک دفرنٹ اپریٹر کال ہوتا ہے دو فلوٹس کو کال اید کرنے کے لیے ایک دفرنٹ اپریٹر it's already overloaded all we do it we are extending the language and this was again جہاں پر ہم نے کلاسیز کی بات چورو کی تھی user defined دیتا تائپس کی بات کی تھی user defined دیتا تائپس مینس we have extended the language and now we are really extending it we are saying user defined دیتا تائپ سی ہیں ورہن کے وبریٹر اس بھی ہیں ورہن کے بیھایویر ڈیفرنٹ ہے اسی طریقے سے اگر ایک سامپل لیں تو جو ڈوبل لیسٹن سین تھا و آپ کو یاد ہم see out کے ساتھ اسلاما ل کرتے تھے as the stream insertion operator کچھیز ڈسلیک کرنی ہے تو ڈوبل لیسٹن میں نے آپ کو یہ بھی بتایا تھا کہ جا بھلوٹس کے ساتھ بزاتے خود overloaded ہے اس کو انٹیجر دیں تو وہ انٹیجر کو دیسپلے کرتا ہے اس کو دبل پرسیجن نمبر دیں تو وہ دبل کو دیسپلے کرتا ہے اس کو سٹرنگ دے دیں تو اس کو سٹرنگ دیسپلے کرتا ہے یہ already knows how to handle all of these but think about it وہ اس سے زیادہ overloaded ہے دبل less than sign جو ہے وہ تو ہم نے bit shift operators میں بھی کاور کیا تھا یعنی ایک نمبر کو اگر آپ left shift کرنا چاہیں با a certain number of bits اُدھر بھی double less than sign لگتا ہے تو overloading actually is quite common and we have already been using it without really knowing about it now we're talking explicitly about operator overloading talking still on the subject of the plus operator for our one simple class پہلے دیکھیں کے دیکھیں ہماری class definition بڑی ہوتی جا رہی ہے کچھ لیکچس پہلے میں نے آپ کو یہ object based programming جہے اس کی خاصلت کی بات کی تھی کہ we write a lot of code in defining the classes and their methods and their operations وہ ہم لکھتے جاتے ہیں لکھتے جاتے ہیں لکھتے ہیں لکھتے ہیں ابھی ہم نے program نہیں لکھا ابھی تو ہم نے class define کی اور بتائے اس کے objects کیسے سم کی ہوں گے ان کا behavior کیا ہوگا ان کے ساتھ ہم کیا کر سکتے ہیں اور آج ہم ان کے لیے operators بھی define کر رہے ہیں اگر ہم جا کے program لکھنے لگیں کہ جی main program میں استعمال کیسے کرنا ہے تو you will notice کے وہ چار لائنوں کا ہی program رہا جاتا ہے it becomes very very simple for example یہ جو plus operator میں دیفائن کیا ہے اس کو استعمال کرنے کے لیے let's write the main program class definition آپ کے پاس ہے the main program simply becomes complex c1 c2 c3 c1 کو initialize کر لیا ہم نے c2 کو initialize کر لیا اور ہم نے کہا c3 equals c1 plus c2 r plus operator will be called a new plus operator and c3 میں c1 or c2 کا complex سم جو ہے وہ آجا جائے گا confirm کر لیں c1.display c2.display c3.display and confirm for yourself کہاں جی edition did work now is this the only way of writing these operators کچھ تھوڑی سی subtle see variation آتی ہے ابھی جو ہم نے complex operator define کیا تھا plus operator اس کے انہر ہم نے ایک complex number pass کیا تھا اور وہ آپ کو یاد ہو by the default convention that becomes a call by value and we also discussed کہ جی reference بھی ایک چیز ہوتی ہے اور اگر call by reference کیا جائے تو تھوڑی سی ہمیں efficiency مل جاتی ہے کہ جی object کا address چلا جائے گا اور ایک address کے ساتھ آپ جتنا مرزی بڑا object جو اس کو access کر سکتے ہیں so you can always say کہ جی جو plus operator ہے اس کو complex number pass نہیں ہو رہا اس کے variation ہم یہ کر سکتے ہیں کہ there's a reference to a complex number so we would write within the argument list of the plus operator we would write complex and c which means c is now a reference to a complex but reference goes more than that let's recap again کہ جی جب ہم لکھتے ہیں z equal to x plus y تو x اور y کو کچھ نہیں ہوتا they participate in an addition operation and the result is assigned to the complex number z having written the plus operator does it also mean کہ ہم نے plus equal to operator بھی لکھ دیا ہے the answer is no don't make any such assumptions آپ کو یاد ہوگا کہ جی انٹیجرس کے لیے ہم x یا i کر لیں i plus equal to 2 جب لکھتے تھے that was short hand for i is equal to i plus 2 اینی i میں ہی دو جمع کر دو اور اس کی value واپس i میں دال دو یہاں پے اگر آپ complex numbers کے لیے plus equal to operator ڈیفائن کرنا چاہتے ہیں تو پہلی بات کہ آپ کو علیدہ سے اس کی definition لکھنی پڑے گی اور دوسری بات جہاں وہ plus سے completely different ہے وہ یہ ہے کہ plus equal to کو drive کرنے والا وہی نمبر ہے جو left hand side پے ہوگا so now if you read wrote something like c1 plus equals c2 تو جو چیز ہم implement کرنا چاہ رہے ہیں وہ ہے c1 equals c1 plus c2 اس لین کو ہم implement کرنا چاہ رہے ہیں اور short hand میں ہم لکھنا چاہتے ہیں c1 plus equals c2 اب why am i highlighting this point جو سیمپل بائنری plus operator ہم نے لکھا ہے وہ اس کے دونوں participants جو تھے جو plus operation میں پارٹسپیٹ کر رہے تھے ان کو change نہیں کرتا تھا in this case the plus equal to operator is being called by the number on the left hand side but after the operation is complete the number itself would have changed so there is a difference in behavior جو میں نے لکھچر کے شروع میں بھی بات کی تھی کہ operator کو اچھی درہ آپ سمجھ لیا کریں کہ یہ بھیب کیسے کرتا ہے ہے so c1 plus equal c2 operation کے اندر c2 کو کچھ نہیں ہوگا لیکن c2 کی value c1 میں add ہو کے c1 ہی update ہو جائے گا so c1 will have a new value let us see how we write this as a member function so again return کیا کریں return کے لیے ابھی ہم اس کو تھوڑا سا ڈیفر کرتے ہیں دو تین منٹ کے لیے but for the moment assume کہ میں complex ہی return کروں گا so i say complex operator plus equal to اب اپریٹر کا نام ہے plus equal to اور پھر اس کو پاس ہو رہا ہے ایک complex number let's say it is being passed by reference so we say complex and c یہ تو اس کا prototype یا اوپر declaration ہو گئی اب اس کی body میں آ جائے by the definition of the plus equal to operator ہم چاہ رہے ہیں کہ جو نمبر اس کو call کر رہا ہے وہ نمبر بزاتے خود چینج ہو جائے so اس کے اندر ہم دیریکلی لکھ دیتے ہیں real plus equal to c dot real which means calling نمبر کا جو real حصہ ہے اس کے اندر past number جو ہے which is c اس کے real حصہ کو جمع کر دو so real is being updated in اسی طرح سے image plus equals c dot image so imaginary part بھی update کر دو اب دیکھیں جو calling نمبر تھا وہ چینج ہو گیا ہے اور وہ چینج کیوں ہوا ہے کہ جی وہ by value آ رہا ہے by reference آ رہا ہے it is always automatically by reference یہ جو this pointر کی بات آئے گی آپ کو سمجھ آئے گا کہ جی member functions میں implicitly جو calling نمبر ہے یا calling object ہے اس کی پورہ reference ملا ہوتا ہے جب آپ اس کی کوئی value بدلتے ہیں تو actual object کی value بدل جاتی ہے تو یہاں پے real کی value بھی بدل گی ہے image کی value بھی بدل گی ہے kiss نمبر کی جو plus equal to operator کے left side بھی بیٹھا ہوا تھا and that is the end of this function ہم چاہیں کیوں میں نے کہا تھا کہ یہ complex return کرے گا تو میں کہا دیتا ہوں return کیس کو now i have to return the number that is being point that is the current number the one on the left hand side so it becomes a little tricky we have to return a reference to that number nonetheless اس کو we will cover this in detail later but for the moment جو چیز یاد رکھنے والی ہے plus equal to is also a binary operator but with a difference اس کے left hand side والہ جو participating number ہے وہ بزاتے خود اس operation سے change ہو جائے گا so there is a difference number 2 ہم نے plus operator لکھا تھا اس کے ساتھ کوئی assumption نہیں ہے کہ جی plus equal to automatically ہو گیا جو operator آپ overload کرنا چاہیں اس کی definition آپ علیدہ علیدہ لکھیں گے let's go on and take a look at how do you make this operator function a non-member function اور ضرورت بھی ہے کہ نہیں ہے we can always make this a non-member function but as a non-member function اس کو دو نمبر ملیں گے plus کو دو نمبر جو ہیں وہ argument list میں ملیں گے اور وہ وہی ہوں گے ایک left side والہ نمبر اور ایک right side والہ نمبر وہ دونوں argument list میں پیش کر دی جائیں گے since it is not a member function جو چیز کا جس چیز کا خیال رکھنا پڑتا ہمیں کہ اب ان نمبر کے internal structure اگر وہ private ہے یعنی real and imaginary parts were in the private section of the complex class then this non-member function cannot access that data so can we write a non-member plus operator without making it a friend of the class سوچنے والی بات ہے well the answer is yes you can but there is a round about way of doing that پہلے you will have to have some function a member function جو کہ real part کی value return کرے so we get function جن کی بات کی تھی so might have a get real function which returns real یہ member function ہوگا اسی طریقے سے آپ کے پاس get imaginary function ہوگا get image جو کہ imaginary part کو return کرے گا تو اب یہ non-member operator جو ہے ہم کہیں گے complex operator plus complex and c1 comma complex and c2 non-member definition اس میں دو complex numbers پاس ہو رہے ہیں لفت والہ بھی اور right والہ بھی علیہ دا علیہ دا اندر جائیں گے اسی طریقے سے we will create a new temporary complex number سو ہی سے complex temp اب ٹیمپ کے جو real part ہے اس کو کیسے کالکلیٹ کریں گے so we say temp.real equals c1.get real with parenthesis that's a function call the function is in the public part of the class so a non-member function can call it or c1.get real returns the real part of the c1 complex number سو وہ اگر return ہو جاتا ہے تو plus c2.get real and the result is assigned to temp.real next line temp.image equals c1.get image plus c2.get image سو اب member functions جو کہ get والے member function سے ان کے ساتھ ہم نے private data کی values extract کرنے ان کے ساتھ ہم نے ایک نیار complex number construct کیا اور اس کو return کر دیا now i mentioned this example just for the sake of completeness because آپ کو obviously نظر آ جائے گا کہ کونسی approach بہتر ہے what do you think here I won't say it's a matter of style کے جی آپ کو جو چیز پسند ہے لیکن there's also an issue of efficiency جو پہلے والہ ہمارا اپریٹر تھا جس کا function ہم نے member function لکھا تھا اس کے اندر کوئی اور function calls ہو ہی نہیں رہی ہے جانتی it was simply taking the data values adding them constructing a new complex number and returning them so one call to the operator two simple addition operations of real numbers کی addition ہو رہی ہے double precision کی اور answer آ جاتا تھا اب جو non-member function ہے ایک اس کی call your definition جیہا اس کی شکل صورت زیادہ سے difference آپ کو پتہ نہیں چلتا کی تھی left کانسا ہے right کانسا ہے but more importantly ہر addition کے ساتھ دو دو function calls ہیں get real get real get image get image function calls cost money money meaning computer time اس کے اندر خرچا آتا ہے so اب ہم نے صرف دو پلا سا اپریٹر اپریٹر اپریٹر اس کی بجائے ہم نے چار function calls اور دو پلا سا اپریٹر اس کر کے دو نمبروں کو جمع کیا ہے it is expensive nonetheless for the sake of completeness you have to know کہ یہ اپریٹر اس as member operators بھی دیفائن ہو سکتے ہیں and as non-member operators بھی دیفائن ہو سکتے ہیں جب وہ member operators دیفائن ہوتے ہیں اب binary plus کی میں بات کر رہو ابھی اور operators کی بات نہیں ہو رہی جب ہم نے member operator plus ڈیفائن کیا تو اس کو ایک number pass ہوگا ایک complex number کیونکہ جو left-hand side پہ ہے plus کی number وہ بزاتے خود operator کو مل جائے گا جب یہ non-member definition بھی جائیں گے تو دونوں number explicitly اس کو pass کرنے پڑیں گے so there's a syntactical difference between the way we write member and non-member functions the other thing that I did mention was no assumptions writing plus does not mean that the plus equal to لکھا گیا writing minus does not mean that the minus equal to لکھا گیا and so on so be careful of these things now یہاں تک ہم arithmetic باتیں کر رہے تھے let's take a look at whether we can do the same with non arithmetic ڈیٹا let us take our own class string and let us try to develop a plus operator for this class very simple class ایک ڈیٹا ممبر ہے 4s 30 it's an array of 30 characters which we know as a string اس کا ایک member function ہم بنانا چاہے ہیں operator plus جس کا action یہ ہوگا کی دو strings کو اپس میں جوڑا جائے یاد رہے پل پلس کو ہم نے دیکھا دیکھا اس کا عام behavior کیا ہوتا ہے with arithmetic numbers and we say کہ look if two strings participate in this plus operation تو string one or string two ان کو کچھ نہیں ہونا چاہیے ان کو جوڑ کے ایک نئی string بنی چاہیے let's say string three جو کہ یہ اپریٹر واپس کرے so return ڈیٹ ڈیٹ ڈیٹ ڈیٹ اپریٹر پلس ممبر function ہے ممبر operator function ہے اس کو ایک string pass ہوگی کنسی جو کے پلس کے right hand side پیاتی ہے کہ left hand side ڈیٹ بالی string اس کو call کر رہی ہے so ہم نے اس کو ایک string pass کر دی let's say string t اور پھر اس کی definition کی اندر چلے گئے definition کی اندر ہم arithmetic تو استعمال نہیں کر سکتے ہمیں string manipulation کرنی ہے so we define a temporary string local almost exactly the same جو کہ ہم نے complex numbers کے ساتھ کیا تھا so we say string temp temp کو پہلے ہم initialize کرتے ہیں by copying a null string into temp so we say string copy temp.s یا جو بھی ہے اس کا مطلب جو اس کا string data ممبر تھا اس کے اندر ہم نے null string copy کر دی اس کے بعد next جو ہے ہم نے string concatenation کرنی ہے so ہم نے temp.s کے اندر string one dot s copy کر دیا concatenate کر دیا now null کے ساتھ کچھیز جوڑیں گے تو وہ نئی چیز ہی ہی آگی وہاں پہ آئے گی اور پھر temp string کے اندر پھر ہم نے concatenate کیا ہے string to والا حصہ اب string to یہاں پہاں پاس ہو رہا ہے as t so t کا جو ڈے ہے character ڈے وہ concat string concatenation operator کے ساتھ ہم نے اس temporary string کے اندر ایڈ کر دیا temporary string اب بڑی ہو گئی and return temp جو چیزیں میں نے یہاں پہلکل بات نہیں کی وہ یہ کہ آپ کو ہر کسم کی error checking یہاں کرنی پڑے گی کہ جی temp بھی ہماری اس very very rudimentary string class کا حصہ ہے string کے اندر ہم نے character ڈے 30 characters کی رکھی ہے what happens اگر جو left side پہ string تھی اس میں 20 characters تھے اور جو right side پہ تھی اس میں بھی 20 تھے اب ان کو add کریں گے تو 40 character کی string بن جائے گی وہ temp کے اندر تو پوری نہیں آئے گی so error checking ابھی کے لیے ہم بات نہیں کر رہے but just ابھی method or construction کی بات ہوری ہے simple ایک local variable declare کیا اس کے اندر جما کی جو بھی جما کا مطلب ہم چاہتے ہیں اور پھر وہ local variable ڈے وابس کر دیا so we've been able to define a simple add operator a plus operator for a string class and the same really applies to any and all classes and objects that we create operator overloading جو ہے it is useful it is useful because it makes our programs relatively easy to understand your program لکھتے ہیں اس اس کے اندر a plus b لکھوہ بڑا آسان ہے c add لکھوہ is more complicated it makes them self-explanatory لیکن میں آج کے لیکچر میں یہ بھی ساتھ ساتھ آپ کو بتاتا گیا ہوں کہ freedom کے ساتھ responsibility لازمی آتی ہے اور وہ responsibility یہ ہے کہ ہم add یا plus operator نہ لکھیں اور operator کی اندر کچھ اوری کر رہے ہوں you could even go into this operator and just use a c out to display some values and come back doing nothing it would still work at love syntax میں اس میں کوئی رلتی نہیں ہے لیکن logically it doesn't make sense so normally try to maintain the sense of the operators plus should mean some sense of adding date one plus a number should mean date میں اتنے دن جمع کر دو string one plus string two means those strings کو اپس میں جوڑ دو complex one plus complex numbers two should mean real parts کو علیادہ جمع کرو ایمیجنری پاٹ کو علیادہ جمع کرو and so on so try to maintain the sense اگلے لیکچر میں ہم کچھ unary operators کی بھی بات کریں گے اور non-member of friend operators کی بات ہوگی till that time خدا حافظ