 اسلام علیکم today cs201 introduction to programming lecture number 32 last time we introduced the concept of operator overloading and then we took some simple examples for complex class we overloaded the plus operator let me recap new operators i.e. new symbols we cannot define them as جو existing symbols ہیں c++ میں صرف انہی کو overload کر سکتے ہیں overloading of operators is exactly like writing functions however, we should take care کہ جو operator کا اپنو original مطلب تھا اس کے قریبتہ رہنا چاہیے i.e. we should not define something like کہ plus operator subtraction کرتا ہے and multiplication operator division کرتا ہے we can do that but that's a bad idea makes our programs practically unreadable and ununderstandable then we said that binary operators will remain binary unary operators will remain unary we looked at some concepts in terms of کہ جی driving force کنسی ہوتی operator کے پیچھے اگر binary operator ہے تو left والی چیز اس کو drive کر رہی ہوتی ہے پھر ہم نے یہ بھی دیکھا تھا کہ جی member operators کب استعمال ہوتے ہیں and non-member operators کب استعمال ہوتے ہیں آج ہم تھوڑا سا اسی concept کو لے کے آگے چلیں گے and the reference for today's lecture there's nothing much new today but the reference goes back all the way to lecture number one and that lecture said pay attention to detail بار بار میں یہ کہوں گا کہ دیتیل پہ بھی غور کرنے اور common sense کے اوپر بھی خیال رکھنا ہے let us start by introducing the minus operator again for our complex class simple enough بالکل جس طرح ہم نے پیسٹی دفعہ a plus operator ڈیفائن کیا تھا پہلے تو minus operator کا action سمجھا جائے minus operator is a binary operator لہذا اس کے دو آگومنٹس ہوں گے in this case both will be complex numbers when we subtract two complex numbers they should return a complex number subtraction of complex numbers is defined as real part میں سے real part کو subtract کرو or imaginary part میں سے imaginary part کو subtract کرو so if you look at the member operator it looks very simply like this complex operator minus complex c member operator ڈیفائن کر رہے ہیں لہذا اس کو ایک آگومنٹ پاس ہوگا وہ والا complex number جو minus sign کے right-hand side پہائے گا جو left-hand side والا ہے وہ call کرنے والا ہے لہذا وہ available ہے اس operator function کو body میں جائیں as with the plus operator ہم ایک temporary complex number ڈیکلیر کرتے ہیں so we say complex temp پھر ہم کہتے ہیں کہ temp کا جو real part ہے that will be the difference of the real parts of the calling number and the number that has been passed to this function so we say temp.real equals real minus c.real c وہ ہے جو ہم نے pass کیا ہے یہ نہیں minus کے جو right-hand side پہ complex number لکھا ہوا تھا next line we say temp.image equals image یہ والا imaginary part ہے left والے complex number کا so temp.image equals image minus c.image return temp complex number return کر دو simple enough اسی کا variant ہم نے پسلی دفعہ دیکھا تھا minus equal to I will again recap minus operator ڈیفائن کرنے سے minus equal to operator ہرگیز ڈیفائن نہیں ہوتا اگر ہم اس کو overload کرنا چاہتے ہیں تو ہمیں پھر سے اس کو ڈیفائن کرنا پڑے گا let us see how that is done again یہ میں تقریبا ڈیفائن رپیٹ کر رہا ہوں تا کہ یہ چیزیں جو ہے clearly آپ کے دماغوں میں بیٹ چاہیں کہ کہاں پہ کیا چیز استعمال کرنی ہے minus operator minus equal to operator ہے وہ like the plus equal to operator behaves in the way کہ اس کا جو calling party ہے which means the complex number which is on the left-hand side اس کی value بھی بدل جائے گی اب ہم چاہ رہے ہیں کہ جی ایک number وہ بزاتے خود اپنی value بھی چینج کر لے جب وہ minus equal to operation کے اندر حصہ لیتا ہے so again we will make this a member operator function لہذا اس کو ایک complex number پاس ہوگا وہ complex number جو کہ right-hand side کے اوپر لکھا ہوا ہے minus equal to operator کے اور جب اس کے اندر جائیں گے تو اب ہمیں as such ضرورت نہیں رہتی کیونکہ ہم جو left-hand side والا number ہے اس کو ہی چینج کرنا چاہ رہے ہیں so we can write real minus equal to c.real where c is the number on the right-hand side of the minus equal to operator and image equal or image minus equal to c.image دیکھیں اب جو minus equal to استعمال ہو رہا ہے اس اوپریٹر کے اندر وہ وہ لہ ہے جو کہ ordinary double precision numbers کے لیے c++ نے بزاتے خود ڈفائن کیا ہوا ہے so a classic example of overloading کہ جو اوپریٹر ہم overload کر رہے ہیں وہ اندر سے اپنی ہی قسم کا جو original ancestral یا basic operator تھا اس کو استعمال کر رہا ہے اندر سے اندر سے اوپریٹر ہم جانتے ہیں ہم چاہیں تو اس کا ریفرنس ریٹرن کر دیں چاہیں تو نہ کریں ہم نے اس کا ڈفائن کیا ہے لہذا ہم یہی پرہنے دیتے ہیں let's go on minus ہم نے ڈفائن کر لیا پچھلی دفعہ ہم نے ایک اور کلاس کے ساتھ بھی کام کیا تھا وہ کلاس تھی string class اور string class کے اندر ہم نے addition کو ڈفائن کیا تھا as joining of two strings تو کیا string class کیلئے minus بھی ڈفائن کر سکتے ہیں the question is more philosophical پہلے تو یہ سوچنا ہے کہ جی کوئی minus operation does it make sense for class string to me it really doesn't I can't think of subtracting two strings unless I come up with some very very artificial definition کہ اگر میرے پاس ایک string ہو لکھا ہو this is a test اور دوسی string ہو اس کے اندر لکھا ہو it may make some sense لیکن اگر دوسی string کے اندر لکھا ہو my name is xyz تو اب ان کے سپٹریکشن کا کیا مطلب ہوگا the point I'm trying to make is ہر operator ہر کلاس کے لیے meaning نہیں رکھتا only use them where they make sense where they make common sense where they make common sense where they make common sense where they make common sense where they make common sense تاکہ پرنے والے کو بھی سمجھائے when we're adding two strings together it makes a lot of sense کہ ہانجی دو strings کو اپس میں جوڑنا ہے تو یا تو میں was string cat operator call کرو اور یا یہ میں plus operator لکھتو but when we're subtracting strings it doesn't make much sense so we don't define it only define things where they are self-explanatory readable understandable let us shift our attention that we have been using that class is the date class date کے لیے let's think in terms of plus کا کیا مطلب ہوگا minus کا کیا مطلب ہوگا and here میں وہ refer کروںگا lecture one or two والی بات کو paying attention to detail اگر آپ کے پاس کوئی date ہو اور اس میں ہم کوئی number add کرنا چاہی so آج کی date plus five مجھے تو اس میں کچھ sense نظر آتی ہے کہ جی جو بھی آج کی date ہے اس میں 5 جمع کریں گے تو ایک نئی date مل جائے گی اسی طریقے سے میں کہوں آج کی date میں سے 10 subtract کر دو تو مجھے 10 دن پہلے کی date مل جانی چاہیے so یہاں پہ here is a usage where plus and minus do make some sense can I subtract two dates together یہ تو ابھی number کے ساتھ باتے تو if I say کہ جی first January 2003 میں سے 15 October 2002 subtract کرو تو اس کا کیا مطلب ہونا چاہیے think about it we will come back to this in a moment for the moment let's go back and look at adding a number to a date adding a number to a date and number will be an integer ہم نے پہلے تو اس کی definition اپنے لیے قائم کی it will result in a new date which will be so many days in the future so we're adding something یہ تکلیر ہوگی بات اب درہ اس کی definition کی طرف چلتے ہیں return کیا ہوگا date I need a new date operator keyword پھر plus آگیا اب کیوں کہ ہم اس کو as a member function define کر رہے ہیں لہاں جو left hand side plus کے date object وہ تو اس operator کو اس operator function کو pass ہو جائے گا جو right hand side پہ integer ہے وہ as an argument pass ہونا چاہیے so parenthesis کے اندر we say int i i is the number of days that we want to add to this date object now comes the detail part کیسے add کریں سوچیں زرا آپ کے پاس ایک date ہے آج کی date لیے لیں لکھلیں کاغرز کے اوپر copy میں لکھلیں اور اس میں دیکھائیں کہ کیسے کریں گے if you try to add a number to a date there are so many different possibilities that can happen suppose آج کی date وہ دو تاریخ ہے کسی بھی مہینے کی ہم اس میں 5 جمع کرتے ہیں تو اس مہینے کی 7 تاریخ بن جائے گی no problem that was step 1 or case 1 case 2 لیتے ہیں آج مہینے کی 28 تاریخ ہے اب اس میں 5 جمع کریں 5 جمع کریں تو کیا date آئے گی پہلی چیز جو obvious ہے کہ یہ مہینہ تبدیل ہو جائے گا اور مہینہ تبدیل ہوگا لیکن اس کی کونسی date ہوگی well it depends it depends کہ اس مہینے میں 30 دن ہیں یا 31 دن ہیں یا یہ فروری کا مہینہ ہے اور فروری کا مہینہ ہے تو یہ لیپیر والا سال ہے یا یہ نون لیپیر والا سال ہے اگر تو یہ نون لیپیر والا سال ہے فروری میں 28 دن ہوگے اور اگر یہ لیپیر والا سال ہے تو فروری میں 39 دن ہوگے یہ لیپیر کیا بلا ہوتی ہے یہ لیپیر کے اپنے رول سے اگر جو ہمارے پاس سن ہے یہاں جو ہے وہ اگر 4 سے تقسیم ہوتا ہوں اور اگر وہ سینچری والا سال ہے تو پھر وہ 400 سے تقسیم ہوتا ہوں exactly without a remainder تو پھر وہ لیپیر کرا دیا جاتا ہے now we are saying کہ when you've got 27th of a month any month اور اس میں ہم 5 جمع کرنا چاہتے ہیں تو now کئی cases بن جاتے ہیں کہ کنسا مہینہ تھا فروری تھا یا نہیں تھا 31 دن تھے 31 دن تھے 28 تھے 39 تھے اس کے مطابق اگلے مہینے کی ڈیٹ بدلے گی so 2 things happened the month changed and the date went according to the current month's number of days اور آگے چلنے جاہنی ہاں ختم نہیں ہوئی what if it was the 27th of December and now you wanted to add 5 چلیں December ہے 31 دن ہیں تو 27 میں 3 یا 4 ہم نے جمع کیا 4 جمع کیا 31 آگے ایک اور جمع کریں گے پہلی تاریخ آ جائے گی کس کی اگلے مہینے کی but December کے بعد اگلہ مہینہ کون ساتا ہے اب دیکھیں اگر computer میں آپ پروگرم لکھ رہے ہیں تو آپ نے probably تو 12 منت کے بعد 13 منت آپ کو نہیں ملے گا تو 12 کے بعد آپ کو first month پے جانا ہے first month پے جانا ہے تو اتنا کافی نہیں ہے اب سال بھی بدل گیا ہے تو سال میں بھی ایک increment کرنے کی ضرورت پیش آئی گی so if you think about it ایک سیمپل سی چیز کہ جی ایک دیت کے اندر کچھ integer number of days add کرنے ہیں it becomes a complex function but think about it اگر وہ complex function ایک دفاہ ہم نے لکھ دیا اور یہ سارے رولز اس میں embed کر کے لکھ دیا تو پھر programming میں ہماری زندگی کتنی آسان ہو جائے گی کہ جی ہمارا سیمیسٹر فلانی تاریخ کو شروع ہوتا ہے اتنے دنوں کا سیمیسٹر ہے لہذا ختم کب ہوگا date سامنے آجاتی you can do date arithmetic let's take یہ میں نے جو آپ کو ایک سمپل دیا ہے date میں integer number of days add کرنے کا اس کا سارہ کوڈ تو آپ کو handouts میں مل جائے گا مل گیا ہوگا آپ دیکھ سکتے ہیں اس کو اچھی طرح study کریں because this is a classic example of paying attention to detail if you miss one case ایک چیز کے اوپر آپ نے غور نہیں کیا تو یہ کلاس شہد آپ کے آج والے لکھے way program کے لئے کافی ہو لیکن یہ general use کے لئے کلاس استعمال نہیں ہو سکے گی so if you want to publish your work you want to say hey I am the greatest programmer in the world یہ دیکھو میں نے جو لکھا ہے اس کو استعمال کرو استعمال کرو اور کیوں کہ تمہاری افت بچ گئی ہے مجھے دوائیں دو then you better pay attention to this detail and make sure that your class handles all of this stuff اسی طریقے سے the counter function date میں سے few days subtract کرنے ابھی تاک آپ کو idea ہو گیا ہوگا کہ کس complexity کا problem ہے let's discuss this a little bit ہے تو وہی چیز but in reverse جنوری کی تین تاریخ ہے اس میں سے 10 دن subtract کرنے تو نہ صرف پچھلا مہینہ جو جنوری سے پچھلا مہینہ ہوگا نہیں لہذا وہ دیسمبر میں جا پڑے گا دیسمبر بدل جائے گا اس کے بعد سال بھی ایک پیچھے چلا جائے گا اور پھر جو دیکھنا ہے کہ جی دیسمبر کی کونسی تاریخ تو دیسمبر کے number of days بھی معلوم ہونے چاہیں اور پھر ان سے پیچھے کو گننا بھی پڑے گا again the same issue کوئی اور مہینہ ہو اب جو number of days وہ current month کے نہیں چاہیں جس مہینے میں ڈیٹ جا پڑے گی اس مہینے کے number of days important ہو جاتے ہیں so programming that is also complex i think that would be a good exercise for you to do that going back ماجھ کی تین تاریخ تھی subtract 7 کونسی دیت آئے گی so now again you have to do some complex arithmetic not complex number arithmetic but complicated arithmetic and see کہ جی لیپیر والا سال ہے کہ نہیں ہے لہذا 39 دن تھے فروری میں یا 28 تھے and counting backwards وہاں پہ جاکے آپ رکیں اور کہیں کہ یہ ڈیٹ رزالت کرتی ہے so it becomes complicated but as I said earlier it's a one-time effort ڈیٹ ارثمتک ہماری لیے کافی ہی important ہے common business usage کی اندر جتنے بھی آپ business sense کے اندر program لکھتے ہیں ڈیٹs بڑی commonly آتی ہیں ایک بندہ ہے وہ کہتا ہے کہ جی مجھے 10 دن کی چھٹی چاہی ہے تو آپ سمپلی کمپیوٹر میں feed کریں کہ جی اس بندہ نے فلانی تاریخ سے 10 دن کی چھٹی لی ہے تو آپ کو پتا چل جائے گا کہ جی کس دن اس نے واپس دیوٹی پر حاضر ہونا ہے it's something that we use every day if you take a number آپ کے پاس دیلی ویجز پر بندہ کام کرتا ہے تو دیلی ویجز means کہ اس کو روز کے روز کے کچھ پیسے ہم نے دینے ہیں لیکن ہم پیمنٹ اس کو روز شام کو نہیں کرتے ہم کہتے ہیں کہ جی ہفتے کے بعد پیمنٹ ہوگی اب وہ کچھ عرصہ ہمارے ساتھ کام کر کے ایک دن کہتا ہے کہ جی کل سے میں چھٹی پہ جا رہوں میرا حصاب کرنے now what you would want to do is ڈیٹہ پیمنٹ سے لیکے آج تک کتنے دیز ہیں دیتہ رثمیٹک ہو رہی ہے simple so it's very common usage and writing a date class with these appropriate operators built in overloaded would be a very very very useful exercise and it adds to your overall programming vocabulary لیکن programming vocabulary جو ہے نا وہ بھی دو کسموں کی ہے ایک تو وہ ہے جو ہم c and c++ کے key words or brackets or semicolons ان کی بات کرتے ہیں دوسی زرا سی higher level vocabulary ہے وہ ہے کہ جی ہمارے tool کے اس کے اندر ہمیں کیا کچھ کرنا آتا ہے جو پہلا حصہ تھا اس course کا اس کے اندر ہم نے دیکھا کہ جی ہمیں loops چلانی آگیں nested loops چلانی آگیں تو ہمیں پتا چلا کہ جی ہم matrices کو بھی ہندل کر سکتے ہیں vectors کو بھی ہندل کر سکتے ہیں اپس میں ان کی multiplication بھی کر سکتے ہیں using those rudimentary tools now if you think about it اگر matrix کی ہم class بناتے اور کہتے کہ جی اس کے اندر ہم نے ایک member function بنادی ہے inverse of a matrix تو ایک دفعہ لکھتے اور بار بار اس کو استعمال کرتے جی matrix invert کرنی ہاں جی function بنا ہوا ہے اسی طریقے سے اگر date پہ آجائیں جو آج کی class ہے جس کی بات ہو رہی ہے تو putting in some rudimentary calculations on date arithmetic ایک date میں کچھ دن جمع کرو تو کیا date آتی ہے کوئی دن subtract کرو تو کیا date آتی ہے they are very very useful functions اور جو میں نے آخری example دیا وہ daily wages والے worker کا اس کے اندر you want another subtraction you want date one minus date two اب دیکھیں اسی date class کے اندر minus operator بزاتے خود overload ہو رہا ہے پہلے تو overall minus کو ہم نے date class کے لیے overload کیا کیا date minus an integer number of days اب ہم اس کو overload کر رہے ہیں date minus date کے ساتھ تو two versions of the minus operator یہاں پہ آئیں گے یہاں پہ بڑی detail سے آپ کو کام کرنا پڑے گا because subtracting two dates is relatively non-trivial one چلیں as a programming idea صرف idea کی بات کرتا ہوں you could think in terms of you look the calculation involved in subtracting two dates is too huge کوئی logical tests ہے جو میں easily perform کر سکوں well the answer is if date one minus date two ہم implement کرنا چاہے and date one is smaller than date two the first question is do we return a negative number let's say we do let's say we do date one minus date two could return a negative number or zero if the dates are identical or a positive number which means کتنے دن کا فرق ہے دونوں dates کے اندر چلیں وہ decision ہو گیا اس کے بعد اب اندر اس کو implement کیسے کیا جائے ایک idea جو آرہا ہے وہ یہ ہے کہ جی میرے پاس کوئی calendar کہیں پر رکھا ہوئے اور میں simply loop چلا دیتا ہوں جب تک next date آتی نہیں ہے اور loop counter کو پڑکے میں بتا دوں گا اتنے دن گزر گئے یہ ایک good idea پہلے ستے دیوڑا پڑا ہو کسی لمبی چھوڑی ڈیرے میں پڑا ہو اگر یہی calendar اگلے سال میں جا پڑتا یہ دونوں dates دفرنٹ ڈیرن میں ہوتی تو ان کی کالکلیشن دفرنٹ ہو جاتی ای will not solve this one for you but I'll let you think about it what about the plus operator between two objects of type date minus operator it didn't make a lot of sense to me plus operator for two dates similarly does not make too much sense to me ایک date میں کچھ دن تو جمع کیا جا سکتے ہیں لیکن ایک date میں دوسری date کیسے جمع کی جائے اس کا کوئی logical straight forward آنسر نہیں آتا so we don't want to define such a function again یہ یاد رکھیں کہ جو meaning ہمارے overloaded operators وہ کافی حتک obvious ہونا چاہیے میں نے کہا ہے کہ جی آپ لکھنا چاہے تو مرزی جو دل کرتا ہے وہ لکھنے function کے اندر لیکن don't write things جو کہ کسی اور کو سمجھیں آئے so I will not define a plus operator for the class date جہاں پہ دو dates جو ہے وہ add ہو رہی ہوں we can add a number to a date but we cannot add a date to a date یہ میں ساری date class کے بارے میں جو بات کی idea behind it was paying attention to detail it is crucial it is necessary think of all the various things that can happen tabulate them determine the logic او پھر programming کرنے شروع کریں again an example that I probably mentioned earlier don't start typing your program before your brain has come up to the same point can you first analyze the problem understand it look at all the cases maybe draw a flow chart maybe write some pseudo code and once you are comfortable with کہ ہم کرنا چاہتے ہیں پھر جاہ کے کیبوٹ پر بیٹیں اور اپنا program لکھنا شروع کریں جلدی نہ کریں یہ جو time ہے spent in analysis and design is arguably the best usage of your time as a programmer the time that you spend debugging and removing errors from faulty code is huge spending time on good design pays off آپ کو debug کرنے کے لیے آپ کو debug کرنا چاہیے کہ یہ کہیں semi colon miss ہو گیا ٹھیک ہے بھئی وہ typing error ہو جاتا ہے ڈال دیا جائے کہیں double quotation mark string a delimiter miss ہو گیا وہ ڈال دینا چاہیے logic error نہیں آپ کو نکالنا چاہیے because logic errors are very very hard to track you may just not worry about the design and start writing code دو کسیز کے لیے وہ چل بھی جاتا ہے آپ دیکلیر کر دیتے ہیں دنیا کو میرا program لکھا گیا میں نے چلا دیا جب دوسر دنیا آ کے اس کو test کرنے لگتی ہے وہ ایک تیسرہ case دے دیتے ہیں program doesn't work it produces some strange results اب کیا کریں syntax error ہے نہیں compiler اس میں ہم سے گزرتا ہے executable file بھی بنا دیتے ہیں ہم اس کو چلا لیتے ہیں لیکن اب اس کے logic کے پیچھے ہم لگتے ہیں اور code میں سے logic determine کرنا is a million times more difficult than determining code from logic پہلے analysis and design and then the code please keep that in mind چلیں آج تھوڑی سے اور بات کرتے ہیں اس دفعہ ہم unary operators کی بات کرتے ہیں یاد رہے unary operators وہ ہیں ہم اس کے پیچھے لیتے ہیں جیسے i plus plus یا i minus minus ہم کرتے تھے انٹیجز کے لیے increment and decrement operators اگن to recap آپ unary operator کو binary نہیں بنا سکتے آپ binary operator کو unary نہیں بنا سکتے ایک unary operator will be overloaded as a unary operator سو now let us try to overload a unary operator and let's take for the moment our date class ہم کہتے ہیں پہلے تو اس کا مطلب ڈیٹارمن کر لینا چاہیے یہاں پہ مطلب مجھے تو obvious لگتا ہے کہ یہ date کو increment کرنے تو کلکی date آجا نی چاہیے سمپر date plus equal to 1 is the same as date plus plus سو this will take will simply increment to tomorrow's date all right اس کو pass کیا چیز ہوگی وہی argument آجاتا ہے کہ جی اگر تو یہ member function ہے تو جو date object plus plus کو call کر رہا ہوگا وہ تو plus plus operator کو مل ہی جائے گا اس کا internal structure is available if it is available then it takes no arguments سو the definition will be it returns a date سو it'll be date operator plus plus no argument list اور اب ہم اس کی definition میں چلے جاتے ہیں سیم argument جو پہلے میں دیرا تھا کہ جی date کو جمع کرنے کا وہ یہاں پہ اپلائے ہوتا ہے in other words we have to pay attention to detail detail means کہ جی اگر date میں ایک جمع کریں تو کنسی تاریخ بن جاتی ہے let's try to work it out کہ جی وہی بات اگر تو یہ ایک month کا آخری دن نہیں ہے تو بڑے عرام سے اس کو increment کردیں صرف تاریخ کو صرف day کو increment کردیں اور واپس آجائیں اگر وہ current مہینے کا آخری دن ہے تو اگلے مہینے کی پہلی تاریخ determine کر کے وہ واپس کر دیں اور اگر صرف یہ آخری دن مہینے کا نہیں ہے بلکہ سال کا آخری مہینہ بھی ہے تو پھر سال کو بھی increment کر دیا جائے suppose we have some function available جو کہ days of month return کرتا ہے given the month number so if I say days of month 6 6 میں مہینے کے days of month مجھے بتاو تو وہ June کے 30 دن return کرے گا it will return 30 and that function let us assume for the moment is intelligent enough کہ اگر میں اس کو count days of month 2 تو وہ yar 28 yar 29 return کرے depending کہ year leap year ہے کہ نہیں ہے لیکن اس کے لئے سال بھی ساتھ دینا پڑے گا so we have to maybe send it the date پورا structure اس کو دے دیا جائے days of month اور آگے اس کو month number کی بجائے date pass کر دی جائے تا کہ اس کو month بھی ہو سال بھی ہو اس کے پاس and it can do an intelligent return if we have such a function let us try to write the plus plus operator using it دیکھیں جو میں نے پسلی دفعہ بات کی تھی day's plus operator جس کے اندر ہم نے an integer pass کیا تھا logic سارہ کا سارہ جو میں نے کہا تھا detail والا logic ہے وہ in a way اس میں شامل ہو جاتا ہے because date plus plus is the same as date equals date plus one ہم نے کہا کہ the days of month ہم نے ایک function declare کر لیا جس کو a date pass ہوگی اور وہ return کرے گا کہ جی اس مہینے میں کتنے دن ہے now we can go into the plus plus logic itself and say کہ جی سب سے پہلے کیا کیا کیا جائے سب سے پہلے let us try to determine جی جو ہمارے current date object کا day number ہے وہ کیا اس کرنٹ مہینے کی آخری تاریخ ہے یا نہیں so we say if day equals days of month اب آگے جو current object ہم نے pass کرنا ہے اس کا pass کرنے کے لیے we have to say something like کہ جی میں کون ہوں یہاں پر you have to use the this operator this operator implicitly ہر member function اس کا pass ہوتا ہے this pointer وہ ہے it points to the current object اسٹمال جو ہے اس کا plus plus کا let us look at it ہم نے program کے اندر لکھنا ہے d plus plus where d is an object of type date جب plus plus operator کے اندر جاتے ہیں تو d کا ذکر نظر نہیں آ رہا ہم نے کہا جیس کو کوئی argument ہی پاس ہو رہا d کا ذکر نہیں آ رہا تو اس کے اندر ہم میں پڑھ ہوتا republic جو پڑھ لینا ہے ہم دیگر اس کے اندر اس پائنٹر اس پائنٹر وہ اس کے اپنائنی اسپاہنٹر یہاں لہاں Doہm اس کے اندر اس کے اندر ہمکررہا ہے ہم کیا بالکناہن ہمیگر اس کی اس پائنٹر ہمیں اس کے اندر ہمیں اپنائنی کیا امچہ واجک آپ کہہ دیتا ہے کہ if ڈی equals days of month or month, day, year current ڈیٹ کا ہم نے پاس کر دیہا اگر یہ day or days of month برابر ہیں تو اس کا کیا مطلب ہوگا دیکھیں if day of the current ڈیٹ is equal to the number of days in the current month then it is the last day of the month سیمپل اناف، اگر وہ ہے تو then we have to do something and the something is increment the month but before we increment the month we should check کہ یہ 12 مہینہ ہے کہ نہیں so if کے اندر دوسرا if شروع ہو گیا if month is less than 12 it is not December then all we have to do is day is equal to one آخری دن تھا نا مہینے کا so next date is the first of the following month so day is equal to one absolute number لکھتی ہے month is equal to month plus one یا month plus plus ordinary integer والا plus plus call ہو رہا ہے year کو ہم نے کچھ نہیں کرنا یہ تو non December ڈیٹ آگئی if کا else part آئے گا else part کہتا ہے کہ یہ December کا آخری دن تھا اب کیا ہوگا day will be one but the month will become January so we have day is equal to one month is equal to one but January of the next year therefore year plus plus یہ اس کا اتناسہ لوجک ختم ہوا لیکن یہ لوجک پورا اوپر سے چلا تھا اگر یہ مہینے کی آخری دیت تھی تو اس کا بھی else part ہے what if this was not the last date of the month we say else last date نہیں ہے تو صرف کلکی تاریخ آجائے گی which is a simple increment we say day plus plus day کے انٹیجر والا plus plus چلایا بات ختم ہوگی plus plus operator کا کام ختم so the plus plus operator was a simple way of adding one to the date object that called it a unary member operator and we defined it as a member function therefore it took no arguments پیشتی دفعہ میں نے ذکر کیا تھا اس کو non-member بھی بنائے جا سکتا ہے لیکن پھر اس کو ایک date object دیں گی and I see no reason کہ اس کو non-member بنائے جائے کیا اس کو استعمال کرتے ہوئے ایک ہم نے operator لکھ لیا plus plus اس کو استعمال کرتے ہوئے کیا ہم اپنا پورانا والا plus function implement کر سکتے ہیں think about it I now see a new way of doing that plus plus operator ہم نے date کیلئے دیفائن کیا تھا کہ جی وہ ایک integer number of days اس کو دیں گے کہ جی یہاں سے date کنسی بنتی ہے next آگے کو چلکے and it will be a positive integer اب اندر جاکے I can write a very simple loop in the plus operator I can say for I equal to 1 I less than the number that we have passed it جو ہم نے کہاں پانچ دن سے بڑھا دو so I less than 5 increment I اور اس loop کی اندر میں کیا کہوں گا کہ جی جو date object ہے اس کو plus plus کر دو now suddenly وہ ہمارا complicated logic boil down to a simple کہ جی increment by one increment by one increment by one till you have incremented by the desired number of days this is a classic example of code reuse now nobody is perfect we cannot see all the way down to کہ جی ہمارا program کہاں کہاں جائے گا یا ہم اس کو لکھتے ہوئے بھی ہم کتنی contortions یا repetition سے گزریں گے لیکن اگر کلاس کو لکھتے بات وہی بات code لکھنے سے پہلے ہم بیٹ کے ذریعہ اس کو سوچ لیں کہ جی یہ اس کا structure ہوگا یہ اس کا public interface ہوگا اس طرح ہم اس کی value set کریں گے اس طرح value display کریں گے اور پھر اس کے ساتھ ہمیں یہ یہ operators define کرنے ہوں گے اور یہ پہلے لکھتے جائیں long hand کے اندر انگریزی ڈوردو کے اندر اور operators کا تھوڑا سا مطلب بھی لکھتے جائیں کہ جی plus operator کیا کرے گا plus plus operator کیا کرے گا تو a good rule of thumb is کہ اگر آپ plus or plus plus کا meaning تقریبا وہی رکھرے ہیں جو ordinary arithmetic میں ہم رکھتے ہیں تو plus plus operator ہمیشہ plus integer operator کیا کام آسکتا ہے keep that in mind we wrote one and we can always use that definition in another member function so a good example of code reuse and there is a side benefit side benefit کیا آجاتا ہے کہ ہم نے plus plus لکھ لیا اور plus لکھتے وقت ہم نے plus plus کو call کیا اور اتنی دفعہ call کر لیا جتنی دفعہ ہم اس میں number add کرنا چاہتے تھے اور پھر پتہ چلا کہ جی کہیں پہ کوئی logical bug رہ گیا you know some little place where for example بو days of month نے نینا غلط number of days return کر دیئے پہلی چیز days of month was a member function and that we used in the plus plus operator definition plus plus operator was a member function we used that in the plus operator definition we building a hierarchy اگر days of month کی اندر کوئی logical error رہ گیا ہے تو وہ plus plus کو بھی affect کرے گا اور and therefore plus کو بھی affect کرے گا لیکن اگر ہم days of month کو تھیک کر لیں گے تو plus plus بھی تھیک ہو جائے گا plus بھی تھیک ہو جائے گا moral of the story is this that whenever we write some code ہم اس کو ایک نظر دوڑا لیں کہ جی یہی چیز ہم نے کہیں اور تو نہیں پھر سے لکھ رہے اسی کلاس کی اندر اگر تو وہ دونوں جوگوں پہ نظر آئے کہ جی وہ days of month یہاں پہ بھی calculate ہو رہے ہیں یہاں پہ بھی calculate ہو رہے ہیں لیپیر ادھر بھی determine ہو رہے ہیں ادھر بھی determine ہو رہے تو فورن بغیر سوچے بے اس کو ایک جگہ پہ کتھا کرنے کی کوشش کریں ہو سکتا ہے کہ وہ ایک کتھا جگہ ہم کر رہے ہیں وہ ایک utility function کی حسیت اختیار کر لیں utility function وہ ہے جو کہ بہر سے کبھی call ہو گئی نہیں وہ کلاس کے private حصے کے اندر ہو جائے گا چلا جائے گا لیکن member function اس کو call کر سکتے ہیں so i would write days of month function as a private utility function private to the date class اس کو date object ہی pass ہوگا اور وہ سمpli current مہینے کے number of days return کر دے گا having checked کہ جی لیپیر ہے کہ نہیں ہے اور کونسا مہینہ ہے اور تیس دن کا ہے یا ایک کتیس کا ہے اس کے total days واپس کر دے گا اس ایک utility function کے ساتھ plus plus بھی ہمارا لکھا گیا plus بھی لکھا گیا کافی زندگی آسان ہو گئی so do not repeat code inside a class do not repeat code anywhere i mean that's a general rule if you're going to repeat the same thing might as well make it a function and take it outside and call the function تو ہم نے تھوڑا سے ایک جگہ پہ کہا تھا کہ the efficiency of speed کے لیے آپ چاہیں تو اس code کو repeat کر دیں but then what we do is we start using macros here we are saying if you put all your logic in a single place and then reuse and reuse and reuse اس سے آپ کی program میں بہت ساری safety آجاتی ہے بہت security آجاتی ہے کہ اگر کہیں غلطی ہوئی تو غلطی دھوننے میں جتنی بھی افرط لگے وہ ایک غلطی تھیک کرنے سے باقی تمام class کا structure یا behavior جو ہے وہ تھیک ہو جائے گا let us take a look at some other interesting things that we can do with this date class ایک common چیز ہمیں استعمال کرنی پڑتی ہے وہ یہ کہ یہ دیت دوسی سے بڑی ہے کہ نہیں in other words a comparison operator so less than greater than less than equal to greater than equal to or equal to double equal to یہ سارے comparison operators ہیں وہ بھی overload ہو سکتے ہیں date کی لیے ہم overload کرنا چاہیں تو کیسے کریں گے how do we determine whether date one is greater than date two پہلی چیز دیتا ہے اس کی کیا ہوگی؟ دیتا ہے سب کے رکھا جو ہی کیا ہے دیتان ہے ایک ہی ایک دیتان ہے اگر دیتان نہیں ہے ہمیلنگ دیتانcameی ایک بل کیوڈی بھول کیوڈی بی ڈبلو ال اور بری سیمپل ہے یہ بولیون ہے انہیں دیتان کال کیا ہے ہمارا جو اپرائیٹر ہے اس کی ریٹرنٹای پر بول ہے لیکن ہمارا جو اپرائیٹر گریٹر than اور پھر ایک آگومنٹ اس کو پاس ہوگا دیت دی تو دی وہ والا ہوگا جو گریٹر than کے right-hand side پر دیت آگا وہ پاس ہوگا جو left-hand side پر دیت آگا ہے وہ اس کو available ہے because this is a member operator of the class logic quite straight forward again before writing code think about it many determine یہ کرنا ہے current date جو ہے جس کا مارپس نام نہیں ہے لیکن data structure موجود ہے جو call کر رہی ہے greater than operator کو وہ دیت دی سے بڑی ہے کہ نہیں اگر یہ میں پوچھوں کہ جناب جو current date ہے اس کا سال دیت دی کے سال سے بڑا ہے تو کیا یہ دیت بڑی ہوگی answer is obviously yes if the year is greater than the date is greater ہا اگر سال برابر ہے تو پھر کیا دیکھنا ہے کہ جی current date کا مہینہ جو ہے وہ دیت دی کا مہینے سے بڑا ہے کہ نہیں اگر بڑا ہے date is again greater answer would be true اگر برابر ہیں تو then you go down and say دی جو ہے وہ بڑا ہے یا نہیں and so on so it's a very simple hierarchical logic nonetheless to be able to write this logic cleanly you should do a case by case writing on paper analyze کرنے کیونکہ اس کا اولٹ بھی چل سکتا ہے اگر date جو ہمارا calling والا object ہے اس کا سال دوسرے والے کے سال سے کم ہے تو وہیں سے ہی واپس چلے جو answer is false so you can go either true true true والا logic or you can go false والا logic sometimes false is quicker you find one test and you're done تو دوسر طریقہ ہے کہ جی اگر ایسا برابر ہے اگن work it out in detail the other interesting thing with this example was کی جی return ڈیپ کیا تیس کی return ڈیپ I said was Boolean so in our usage program جہاں سے یہ ڈیٹ ڈیٹ اوپ ڈیٹ استمال ہو رہے ہوں گے suppose you had date ڈیٹ ڈیٹ ڈیٹ و and date ڈیٹ دی ڈیٹ ڈیٹ وی will write something like if ڈیٹ ڈیٹ ڈیٹ ڈیٹ آن ڈیٹ و why will you how would we write this simple answer is going to be true or false if statement کو اندر ایک ایک بولین ویلیو چاہیے true یا false اگر اس کی return ڈائپ یہ ہے تو if ڈیٹمینٹ as is چلے گی so you can write very nice clean code saying if date 1 greater than date 2 تو یہ کرو برنا جو بھی کرنا ہے ایک دوسرا point ہے دیکھیں یہ جو greater than operator تھا یہ date class کا member operator ہے لیکن کہیں ایسی چیز تو ہم نے نہیں بھی ایسی چیز میں بھی جیسے لگنا ہے اور ہم نے already decided it could be negative or positive بہت تھی انٹیجر ہے لیکنی اسی سب کوئی ایسا رول نہیں ہے جو ممبر اپریٹرز ہیں وہ اسی کلاس کا abject return کریں لیکن return whatever is ڈیسیسی رہیے سو now you can go and write your own functions for the date class all the comparison operators greater than greater than or equal to equal to less than or equal to less لیس than. یاد رہے کہ جب بھی ہم کمپیرزن کی بات کر رہے ہوتے ہیں تو یہ چار پانچ اوپریٹرز جہیں یہ کمپلیٹ سیٹ بنتا ہے if you writing one you might as well write all of those. دیکھ کلاس ہم نے کافی develop کر لی اور اس کے اوپر مجھلہ quote you can have you have it in your handouts I would prefer کہ جی آپ handouts کو ایک دفعہ سٹڑی کر لیں ضرور سٹڑی کریں اچھی طرح دیکھ لیں لیکن پھر اس کو بنت کر دیں بنت کر کے as an exercise اپنے لیے دیٹ کلاس دیفائن کرنے چلیں دیٹ کلاس کی دیفنیشن میں وہی پرنسپلز آپ سامنے رکھیں کہ اس کے اندر کیا ہونا چاہیے اس کی values سیٹ کیسے کرنی ہے اس کے constructors ہمیں کیا چاہیے اس کے destructor ہونا چاہیے یا default destructor چلے گا that's a decision that you have to make اس کے بعد اس کے ممبر functions کیا ہونے چاہیے جو بہر سے نظر آئیں public interfaces کا کیا ہوگا and then going on you look at the operators that you will require for this class and you start defining those operators operator definition کی ہم بات کر رہے ہیں operator overloading کی ایسیترہ جس چیز کا اپنے خاص خیال رکھنا ہے اور پھر اسی date کلاس کو ہم example دیتے ہیں ہم کہتے ہیں date plus five and we've already said the answer should be date a date object which is five days later than the calling object what if we wrote five plus date پیچھلے لیکچر میں بھی میں اس بات کیا ذکر کیا تھا when a situation like this happens and it can happen when you write a class and you publish it for usage other programmers might want to use it ان کا logic جو ہے وہ کہتا ہے کہ جی days plus date we're days in an integer so you've got a situation جہاں پہ left side پہ جو چیز آ رہی ہے وہ integer ہے پھر plus operator آ رہا ہے اور پھر date object آ رہا ہے اور days plus date واپس کیا کرے it should return an object of type date if it returns that you need yet another function you need another operator you will have to look at the set of operators that you need for this class list them out write down their behavior be very clear what you expect them to do and then start writing the class اس کو لے لیں کہ جی days plus date ایک integer plus date کو implement کیسے کیا جائے تو left side پہ کیا آ رہے integer اگر integer left side پہ آ رہا ہے تو یہ member function تو ہو نہیں سکتا member function ہمیشہ object call کرتا ہے یہاں پہ object call نہیں کر رہا ہے یہاں پہ تو integer call کر رہا ہے so it has to be either a friend function بہر بیٹھا ہوئے integer کے ساتھ دیفائن ہوا ہے دو اس کو arguments ملیں گے ایک integer ملے گا ایک date object ملے گا اور پھر اس کے اوپر کیونکہ وہ friend ہے ایک date object ملے گا اس کے اندر والا structure اس function کو available ہوگا and you would create a new date object based on the days and the date passed to it and return that object as the return type so this is quite the opposite of what we just spoke about میں نے بھی بات کی تھی کہ جی member function کیلئے کوئی لازمی نہیں ہے کہ وہ return class کا ہی object کرے so we returned an integer and returned a boolean from a member function یہاں پہ ہم اس کے ڈلٹ بات کر رہے ہیں کہ ایک non-member function جو ہے which is a friend in this case is returning an object of type date so it can work both ways and there is no law that says this cannot work when we have listed out comprehensively کہ ہماری class کا interface کیا ہوگا اس کو interface کہتے ہیں کیا کیا functions بہار سے نظر آن گے کیا کیا operators ہم بہر سے استعمال کرنا چاہیں گے جب یہ definition ہو جائے جب ہم نے ہر ایک دو دو لائنے لکھنی کہ یہ کیا کرے گا یہ کیا کرے گا یہ کیا کرے گا پھر آپ جائے اس کا code لکھنے کی طرف اور بات وہی ہے کہ code لکھتے لکھتے آپ کہیں گے یہ کلاس تو بڑی لمبی ہو گئی ہے لیکن جب کلاس لکھی گئی لپیٹی گئی کمپائل ہو گئے اس کا object code بن گیا تو main program کے اندر date object مسئلہ ہی کوئی نہیں ایک header file ہماری date.h اپنی بنائی ہوئی وہ include کریں گے اور اندر جا کے مزے سے date d1 d2 d3 d1 plus 5 d2 minus d1 اس طرح کی سارے operations کر رہے ہوں گے date.display کر رہے ہوں گے بڑی خوبصورتی سے date display ہو جائے گی screen کے اوپر ہم کہیں گے date کو initialize کر دو اس کا constructor call یہ نہیں جتنا ہم کام کرتے رہتے ہیں کلاس کی definition اس کے اندر وہ کام زایا نہیں ہوتا وہ ہماری جو main program کی programming تھی اس میں بہت ساری آسانیہ پیدا کر دیتا ہے and the biggest biggest single advantages the encapsulation that has happened all of the logic that was needed to manipulate the objects in this case of class date is now encapsulated in that class اگر اس کا behavior کہیں پے بھی ہمیں غلط ملتا ہے all we need to do is go to that class correct that behavior recompile the program and we are done conventional functional programming یا structured programming کے اندر یہ logic جو تھا یہ program کے مختلف حصوں میں بٹا ہوتا تھا it was everywhere کہیں پے کچھ چیز امبید ہوئی ہے کہیں پے کچھ ہوئی ہے کہیں پے کچھ ہوئی ہے کہیں پے کچھ ہوئی ہے نقصان اس کا بھی یاد رکھیں کہ ہم پہلے spaghetti code سے چلکے وہ سمانیوں والا code جس کی بالکل سمجھ نہیں آتی تھی ہم structured programming کے طرف گئے تھے یہاں پہ ہم نے functional definitions علیادہ علیادہ کر دی لیکن اب جب ہم نے دیکھا کہ جی ایک date type پہنے پولیٹ کرنے کے لیے پہلے تو ہم کو structure لیتے پھر اس کے لیے ڈیسیوں function لکھتے اور function جو ہم کوئی سورس فائل میں ہوں گے ہمارے program میں جب ضرورت پیش آئی نیا function لکھ دیا کام چل آ لیا یہاں پہ ہم ساری functionality جو ہے وہ date class کے اندر encapsulate کر رہے ہیں یہاں another reason for doing all of the homework all of the thinking that we want to do before we write the code I will still say کہ جی there is no way on earth that you can determine تمام date class کی usage اور وہ uses اگر سارے کے سارے آپ determine کرنے بیٹھیں اور لگیں 6 مہینے لگیں جی ہم date class بنا رہے ہیں ہم اس کو define کر رہے ہیں code پھر لکھیں گے وہ بھی impractical سی چیز ہے we would want to keep it within limits but do the homework then you write it in one place and your logic and your structure and all its manipulation are nicely encapsulated now you reuse them as many times as you want do the homework well چلتے چلتے ایک اور usage میں بتاتا چلو وہ ہے friend operators کی ابھی تک ہم نے friend operators کی بات کی کہ جی وہ class میں استعمال ان کے requirements تب آ جاتی ہے جب جو driving کرنے والی چیز ہے وہ class کا object نہ ہو یعنی integer plus date جیسا example آ جائے تو اب operator کو drive جو ہے وہ integer کر رہا ہے so what do we do we use a friend function but there are instances جہاں پہ friend operators جو ہیں وہ دو مختلف classes کو منپلیٹ کرنے کے لیے بھی استعمال ہوتے ہیں classic example یہ پھر math میں جانا پڑے گا ہم vectors اور matrices کو multiply بھی کر سکتے ہیں اور اگر multiply کرنا ہو ایک vector کو ایک matrix کے ساتھ تو پھر your multiplication operation ہے وہ دونوں کا friend ہوگا اور اس کو دو چیزیں ملیں گی ایک vector ملے گا ایک matrix ملے گی اور پھر اس کا operation ڈیفائن ہوگا so keep that in mind friend operators can also be used to in a way glue two classes together نقصان وہی ہے کہ اس glue کرنے کے اندر the classes also may become intricately linked اور then we have all the set and get functions which we can use چلیں enough about operator overloading for the moment but as usual my stress is please experiment for yourself write your own overloaded operators and see how they work and for fun not as a practice but for fun bullet to lot operators بھی لکھیں plus لکھیں جوکے multiply کرتا ہو multiply لکھیں جوکے minus کرتا ہو اور پھر زرا ایک program بھی لکھیں کہ جی اس logic کے ساتھ آپ program لکھ بھی سکتے ہیں کہ نہیں I'm sure you will agree at the end of the day کہ plus کا مطلب plus ہی رہنا چاہئے multiply کا مطلب multiply ہی رہنا چاہئے till next time Khuda Hafiz