 اسلام علیکم، today's لیکچر number 34 of CS201 Introduction to Programming آج کے لیکچر میں ہم objects اور ان کی arrays کے بارے میں بات کریں گے اور دیکھیں گے کہ جی ان کا freestore کے ساتھ کیا انٹریکٹشن ہوتا ہے then we will talk about new and delete operators and maybe we will have enough time to cover the overloading of the array operator لیکن ہم انٹریکٹشن ہوتا ہے دیکھیں، objects جو ہم what are they they are instances of a class what is a class class is nothing but a user-defined data type جب ہم نے کہ دیا کہ جی class ایک data type کو دیفائن کرتی ہے اور پھر ہم اس کے objects انٹریکٹ کر سکتے ہیں it's the same way of saying جی ایک integer data type ہوتی اور اس کی ہم integers create کر سکتے ہیں تو اگر ہم integers create کر سکتے تھے تو we have already worked with arrays of integers so why cannot we work with arrays of objects certainly we can and the declaration is very very similar in fact is exactly identical the way we do that is to declare an array of objects اگر a date ہے for example ہمارے پاس تو ہم کیا جیتے ہیں date space my dates within square brackets 10 this line says my dates is an array of 10 date objects now تھوڑا سا یہاں پہ جو ٹریکی بات آتی ہے وہ یہ ہے کہ جی یہ objects اس لین کے ساتھ create ہو جائیں گے میمری کے اندر اگر objects create ہوتے ہیں تو کیا ہوتا ہے یاد ہے آپ کو for every object created a constructor is called now we have already dealt with constructors to quite an extent and we have said that look by and large ہم اپنی جب کلاسیز ڈیٹ کریں گے تو ان کے ساتھ کلاس ہم خود ڈیفائن کر رہے ہوں گے so جب ہم ایسی کوئی لین لکتے تھے ہیں date my dates 10 تو ہر object کے لیے from my dates 0 my dates 1 all the way up to my dates 9 ایک ایک دفعہ constructor call ہو رہا ہوتا ہے and constructor کس کلاس کا date class کا یہاں پہ ہم نے کوئی initialization نہیں کیا simply an array create کی ہے so default constructor جو بھی ہم نے ڈیفائن کیا ہوا ہے وہ call ہو گا یاد رہے کہ اگر ہم وہی پرانے والا date class استعمال کر رہے ہیں جس میں ہم نے month, day اور year رکھے بے تھے اور پھر ان کو کوئی default values بھی دی ہوئی تھیں تو وہ default values والا constructor call ہو رہا ہو گا اگر کوئی constructor تھا which took no arguments تو پھر وہ call ہو رہا ہو گا and so on but a constructor will be called for every object that is created by declaring an array of objects can we somehow initialize this array while declaring it it's exactly the same as initializing an array of native data types دیکھیں انٹیجرز کے لیے ہم کر لیتے تھے کہ جی int array 10 اور پھر equal to لکھے braces لکھے ہم 10 انٹیجرز لکھتے تھے اور وہ 10 انٹیجرز وہ automatically اس array کے her different element کو assign ہو جاتی تھیں values یہاں پہ بھی ہم date my dates 10 لکھ کے equal to کا sign لکھے braces کے ساتھ ہم 10 initializers دے سکتے ہیں وہ initializers کیا ہو سکتے ہیں they can be constructors we could actually write date اور پھر parenthesis کے اندر month, day اور year کی value that becomes one initializer کیونکہ constructor نے کام کر کے ایک date object return کرنے ہیں اس کی value my dates کے پہلے element my dates of zero کو assign ہو جائے گی یہاں پہلے تھوڑا سا رکھنہ ایک بات میں ریویو کرتا چلوں دیکھیں c or c++ کے اندر جو arrays ہیں they are zero based whenever we declare an array of 10 objects ان کے index جو ہے وہ zero سے شروع ہوتے ہیں اور 10-1 یعنی 9 پہ ختم ہوتے ہیں if you declare an array of 56 objects تو اس کا index جو ہے وہ zero سے شروع ہوگا اور 55 تک جائے گے یعنی 56-1 why I'm mentioning this is that's one of you submitted code for me to review اور اس کے اندر string یعنی character array ہندل کی ہوئی تھی اور انہیں ایک بڑا subtle mistake کیا ہوا تھا انہوں نے کوششے کی تھی کہ ایک string array لیکے اس کو in reverse order پرنٹ کیا جائے میں نے آپ کو لیکٹر کے دوران بھی کہا تھا کہ یہ ایک سپیریمنٹ کریں لکھنے کی کوشش کریں the code was well written the program was well thought out quite simple اس نے ایک input lead user سے ایک array کو populate کر دیا let's say 5 characters کو اور پھر اس کو reverse ایک loop لکھی فرق یہ ہوا کہ انہوں نے کہا جی اس ایرے کا سائز ہے let's say array size انہوں نے input کیلئے جو loop لکھی وہ تو standard لکھی for i equal to 0 i less than array size i++ اور see ان کے ساتھ character array of i کو پرلو اب یہاں پر اگر for loop اندر i کو دیکھیں تو وہ 0 سے چلا and less than array size تک گیا جو بھی array size کی value تھی جب اس کو reverse کرنے کی باری آئے نے کہا جی کہ ایک array تو میرے پس پوری کی پوری ہے تو کیونہ ہم last element سے پرنٹنگ شروع کریں اور شروع کے element تک پرنٹنگ کرتے جائیں انہوں نے loop لکھی for i equal to array size i greater than equal to 0 i minus minus اب اس لائن کو زراہسا اور سے دیکھنے کیا with i equal to array size which is the size of the array کتنے element سے اس کے اندر ختم اس کو کیا 0 پہ i greater than equal to 0 تک چلنا ہے اس نے 0 پہ ختم کیا اور پھر ڈیکریمنٹ کیا i کو greater than equal to 0 تا بلکل ٹھیک ہے کیونکہ array کا element number 0 is the first element but ان کا starting point والد تھا وہ starting point تھا i equal to array size array size as I have just mentioned تو 10th element index element کوئی نہیں ہے 10th element کا index is actually 9 اس loop کو شروع ہونا چاہیے تھا for i equal to array size minus 1 سے شروع ہونا چاہیے تھا and then i greater than equal to 0 پہ ختم ہونا چاہیے تھا نتیجہ کیا ہو رہا تھا کہ جی وہ یاد ہوگا اگر string ہوتی ہے یہ تو character array تھی اگر string ہوتی تو وہاں پر null character پرنٹ ہونے کی کوشش ہوتی کیونکہ array size پر null character بیٹھا ہوتا بہت ناندلیس you have to be careful whenever handling arrays that they are zero based again just continuing that and making sure that the point comes home کئی دفعہ اپنی convenience کیلئے ہم one based indexing چاہتے ہیں تو اگر آپ date کا اگزامپل دیکھیں کتاب میں بھی اور کچھ آپ کو handouts میں بھی شاہد دیا ہو تو dates کیلئے ہم نے internally months بھی رکھے میں months کی ایک array رکھی ہوئی ہے ہم چاہ کیا رہے ہیں کہ جی اگر کسی بھی تاریخ کا مہینے کا نمبر ہمیں پتا ہو پانچوہ مہینہ تو اس ایرے میں سے اس مہینے کا نام ہمیں مل جائے so if we have month value is 5 in a date object than the month name should be may problem is کہ اگر month کی ایرے ہم 12 names کی رکھیں تو اس کے indexes چلیں گے 0 to 11 month کی value جو date object میں پڑی ہوگی وہ ہوگی 5 تو اگر array میں index 5 دے کے آپ حاصل کریں گے مہینے کا نام تو وہ may نہیں آئے گا June آجائے گا because that is the sixth element so be careful when handling elements like this اس کے لیے ہم نے بڑی simple trick کی ہے and when memory is not a problem and in this case it is not you can use it کہ ہم نے مہینوں کی ناموں کی جو array کی وہ 13 length کی define کی اور اس کا پہلہ element یعنی جس کا index 0 ہے اس کو رہنے دیا empty رہنے دیا اور پھر جنوری فیبری مات سے شروع ہو گئے programming کی اندر ہمارے لیے اسانی کیا پیدا ہوئی کہ کہیں پے بھی میں کہو month name of month number تو automatically سہی مہینہ مجھے ملے گا so sometimes you waste a little bit of memory we wasted the 0th location in the month name array but you get a lot of programming convenience out of it nonetheless please never forget that c and c++ arrays are 0 based now going on to are objects and arrays of objects let us see where we were میں نے کہا کہ اگر ہم 10 دیٹس کی ایک array create کر رہے ہیں تو 10 دفعہ constructor call ہوگا اور اس array کو اگر ہم initialize بھی کرنا چاہیں declaration کے وقت تو ہم normal اپنا syntax استعمال کرتے ہیں کہ braces کے اند 10 initializers دے سکتے ہیں initializers کے لیے ہم constructors بھی دے سکتے ہیں اور constructor جو ہے وہ constructor by name call ہو جائے گا تو it will see date and within parenthesis جو بھی ہم نے month day year دینا ہے وہ آپ دیتے جائیں گے 10 دفعہ 10 objects initialize ہو کے array میں place ہو جائیں گے اگر آپ کے پاس overloaded constructors ہیں تو you can mix and match you can say date پہلہ object جو اس کو initialize کرنے date with month day year دوسرا array کا element جو ہے اس کو initialize کرنے date 0 1 jan 2 0 0 2 and so on so you can mix and match constructors اگر آپ کے پاس کوئی ایسی کلاس ہو جس کے اندر maybe ایک single element پڑا ہو for example ہماری وہ string class تھی the string class درکلی بھی initialize ہو سکتی ہے by just passing it a character string so you could have said ایک string array بنا دو اور اس میں constructor کی بجای see the string آپ لکتے ہیں and assign ہوجائے گا array element کو آپ string کا constructor کال کر لیں اس کی جتنی بھی variety ہے you can do that so there is a myriad of ways there are many ways that you can initialize an array of objects جو چیز یاد رکھنے والی ہے جب بھی آپ ایک objects کی array create کرتے ہیں تو ہر object کے لیے constructor کال ہوگا please remember that that is very important and you can make a constructor of any dummy class اور اس کے اندر ایک line لکھنے کہ جی constructor being called see out کے ساتھ display کر دیں اس کے بعد main program میں simply declare an array of those objects and complete the main program اس کو جب آپ چلایں گے اگر آپ نے 10 objects کی array create کی ہے تو آپ کو constructor being called 10 دفعہ نظر آئے گا so it's important to realize that constructors are called یہ point actually self obvious اس کے constructor کی اس کی وجہ کیا ہے exist کرنے کی the object behind a constructor the objective behind a constructor let's not confuse the words the objective behind a constructor is to give us an object that is properly initialized and therefore whenever we create an array we do not want to have objects that are not initialized properly strings کی array لے strings کی یا تو buffer کی allocation کرنی ہے اس کے لیے کوئی memory سے جگے لینی ہے ہر string object کی لیے اور اگر ان objects کی array بنی ہو تو ہر array element کی لیے علیادہ علیادہ buffer allocate کرنا لازمی ہے اس کی لیے constructor call ہوگا so please be aware of that question یہ ہے کہ ہم dynamically objects کی arrays وہ declare کر سکتے ہیں answer is as usual yes we can do that we have the new operator to do that so اگر ہمارے پاس string کی class ہم لے لیں ہم کہتے ہیں string star text this line simply declares that text is a pointer to an object of type string اگر pointer ہے تو اس کے ساتھ ہم array بھی declare کر سکتے ہیں so we can go down and say text equals let's say five ہم نے کہتے ہیں text equals new string five what this does is free store سے five string objects کی جگے allocate کر کے ان کے constructors call کر کے اس array of five strings کا جو starting address ہے وہ text میں رکھتی آ جاتا ہے now notice یہاں پر تھوڑا سا difference آ رہا ہے whenever you use new to allocate storage for objects ان کو initialize نہیں کر سکتے initialization صرف declaration line کی طرح ہوسکتی ہے اگر ہم کہتے strings my strings five تو پھر ہم string my strings five کر کے آگے initializers دے سکتے تھے جب ہم نے new کے ساتھ جگے ان کے لیے allocate کی تو ہم initializers نہیں دے سکتے اگر initializers نہیں دے سکتے تھے when objects create ہو رہے ہیں ان کے constructors call ہوں گی answer is default constructor وہ constructor جس کو کوئی ہم arguments pass نہیں کرتے وہ class کے لیے موجود ہے اگر آپ نے نہیں لکھا تو c++ provide کر دے گی but normally وہ بھی ہم نے لکھا ہوتا ہے default constructor تو new کے ساتھ جب بھی وہ اسی طریقے سے کام کرتا ہے جو کہ native data تیپس ہم استمال کرتے ہیں اس کے اندر کچھ words of caution لازمی ہے جب ہم ایک array of objects کو new کے ساتھ allocate کرتے ہیں جب اس کو delete کرنے جاتے ہیں it is important to tell the delete operator کہ یہ an array delete ہوری ہے اسی example کو لے لیں ہم نے کہا text کو کہا text is equal to new string 5 5 string objects create ہوئے ان کا starting address اور وہ contiguous memory میں ہوں گے کہ starting address text کو allocate ہو گیا ہم نے استمال کیا یہ string objects array of strings استمال کیا اپنے program میں اور ختم کرتے وقت ہم نے کہا delete text اگر ہم delete text لکھ دیں گے کیا ہوگا what will happen is کجی delete کو ہی پتا چالے گا کہ یہ array delete ہوری ہے اور remember کہ whenever an object goes out of existence تو اس کا destructor call ہوتا ہے in this case کیونکہ string objects ہیں ہم چاہیں گے کیس کا destructor call ہو کیونکہ string object نے بزاتے خود اندر کچھ memory allocate کر رکھی ہے وہ memory free کر کے freestore پے دالنا لازمی ہے لیکن ہم نے لکھ دیا delete text اس سے کیا ہوگا what happens to be the first object in the array so actually text of zero کا address پڑا ہوئے text کی اندر so delete text will simply delete text of zero the object text square brackets zero ایک object delete ہوگا ایک object destructor call ہوگا اور ایک object کی memory free ہوگے freespace پے چلی جائے گی text one text two text three text four کے objects ویسے کی ویسے رہی گی اور memory زائیہ ہو جائے گی زائیہ in the sense کہ our program اور other programs running on that computer will not be able to use that memory it's another example of a memory leak so if we want to delete in other words destroy an array of objects that were allocated using the new operator we must use the array equivalent of the delete operator اور وہ array equivalent ہے delete کے بعد empty square brackets لکھیں so we say delete square brackets text اب کیا ہوتا ہے جیسے ہی ہم یہ لائن لکھتے ہیں تو delete operator کو پتا چاہتا ہے کہ یہ ایک array delete کی جا رہی ہے now the compiler will go back and look at کہ یہ جب array allocate کی گئی تھی اس وقت کتنی جگہ لی گئی تھی so it will discover کہ یہاں 5 string objects ہم نے یہاں پر allocate کیے تھے so now وہ 5 strings objects کو deallocate کرنے جائے گا 5 destructors کال ہوں گے 5 دفعہ memory ہوجی پوری array array جو ہے وہ پرپرلی destroy ہو سکے گی یہ چیز اپلکیبل ہے whenever you are doing memory allocation if you do something like new int 10 we allocate space for an array of 10 integers native data type ہے simplesی جگہ لیتا ہے اور پھر اس کو ہم assign کیا تھے let's say iptr کو اور آگے جاکے ہم کہتے ہیں delete iptr that will free all of the space allocated by the eye pointer but it's a bad usage usage خراب ہے you must always use the delete with the array notation which is delete square brackets iptr or delete square bracket text or whatever you are doing whenever you have to allocate an array of objects for example ہم یہی allocation اگر کرنا چاہے کہ new کو استمال کریں or date class کے objects بنائیں تو دیکھیں وہاں problem تھوڑا سا کم نویت کا ہے because date کے اندر کوئی memory manipulation نہیں ہو رہی string کے اندر ہو رہی تھی so we could actually create an array of date objects and then eventually using new idea کیوں ہے دیکھیں object based programming یا object oriented programming کے اندر ہم کہہ رہے ہیں کہ implementation اور interface کو ہم نے علیدہ علیدہ کر دیا ہے ہم ایک class لکھتے ہیں اس class کو ہم publish کر دیتے ہیں for use by others ہم نے اس کا interface define کر دیا اگر interface define کر دیا ہے تو users have started using that میں اس class کو بہت زیادہ efficient بنا سکتا ہوں but interface کو میں change نہیں کروں گا میں اس کی implementation کو ہاتھ لگاوں گا I will change the implementation make the class maybe 10,000 times faster than my previous implementation of the class and the users don't have to change their programs they simply recompile and they go they've got a new version آٹھ کی گاڑی یا آج کل کی گاڑی interface تقریبا برابر ہے ہمیں آج کی بھی گاڑی چلانی آتی ہے پرانی مل جائے وہ بھی چلا لیں گے لیکن implementation totally بدل چکی ہے اب دیکھیں میں نے example دیا کہ دیت class کے اندر ہم memory allocation نہیں کر رہے تھے لہذا ہم delete کے ساتھ without array notation ہم pointer delete کر دیتے تو it was safe کل کو ہم اس کی implementation بدل دی جو اس کو استعمال کرتے رہے ہیں انہوں نے delete بڑے مجھے سے استعمال کیا ہوا تھا without the array declare declaring it کہ یہ delete کے ساتھ array جو ہے وہ delete ہو رہے ہیں what happens well the program doesn't break down but a continuous memory loss is happening every time you delete ایک object delete ہو جائے گا باقی نہیں ہوں گے ان کی memory i.e. واپس free store پہ نہیں جائے گی memory leaks will happen سو it is good programming practice that whenever you use the new operator to allocate space for an array native data type ہو یا آپ کی class کے objects ہوں تو delete operator کے ساتھ بھی آپ array notation استعمال کریں delete square brackets empty اور پھر pointer کا نام جو کہ array کو point کر رہا تھا اسے ہمیشہ memory deallocation properly ہوگی destructor ہو نہ ہو that's a issue but just a matter of programming style you should always use this notation اب ذرا آگے چلتے ہیں اور دیکھتے ہیں کہ یہ new اور delete میں کو operators کہا رہا ہوں ان کو ہم overload کر سکتے ہیں کہ نہیں اگر کر سکتے ہیں تو اس کی کیا وجہ ہے کہ ہم overload کرنا چاہیں گے well the first answer is yes we can overload new and delete ان کی overloading بھی depend کرتا ہے کہ they can be overloaded as non-member functions of a class or they could be overloaded as non-member functions which means global new or delete overload کرنے کیوں ہم کرنا چاہیں گے well few وجہ ہیں وہ تھوڑی سی advanced programming کی طرف جاتی ہیں لیکن sometimes we want a program to run in a specific amount of time ہم کہہتے ہیں جب بھی ہم memory allocate کریں number one وہ allocation fail اور وہ اتنے microseconds کے اندر ہمارے پاس واپس result آجا نا چاہیے کئی دفاہ جو built-in new operator ہے وہ یہ condition satisfy نہیں کرتا example دیکھیں میں نے کہا اس کو program کے اندر کہ مجھے ہزار integers کیلئے جگہ دے دو now the new operator that's built-in may fail fail ہونے کی میں نے پہلے بھی ذکر کیا دو وجہ ہو سکتی ہیں ایک یہ کہ جی free store کے اوپر ہی کوئی نہیں وہ نہیں ہے تو overloaded ہو نہ ہو کچھ نہیں ہو سکتا آگے آپ allocate نہیں کر سکیں گے space کو لیکن what happens اگر free store وہ fragment ہو چکا ہے جنی آپ نے کچھ memory وہاں سے لی پھر کچھ اور مانگی پھر کچھ اور مانگی تو جو free store ہے اس کے ٹکڑے ٹکڑے ہو چکے ہیں اب جو available memory ہے وہ تو ہزار integer سے کہیں زیادہ تو جو built in new operator ہے وہ ایک block حاصل نہیں کر سکے گا ہورو آپ کوئی آپ کو اپری اپری اپری اور پھر کہ ہی اس مانگی کو اس طریقے سے مانگی کرو تاکہ وہ خالی جگے تھی وہ ایک جگے پہ ہو جائیں اور پھر جب ہو جائیں تو مجھے وہ مانگی کا حاندل واپس دے دو ہمیں ہمیں اپری پرانی پرانی بھی اس کے ساتھ ڈونسائٹ ہمیں ہے کہ ہمارے لیٹر ہمارے لیٹر جو اپری اللون اپرانی ڈونسائٹ کیا ہیں ڈونسائٹ یہ ہے کہ آپ ڈونسائٹ ڈونسائٹ ڈونسائٹ لیٹر انجای ڈونسائٹ اور ڈیلیٹ سب آپ ڈونسائٹ آپ کو جو لیٹر ڈیلیٹ اس پروگرم کئے also ڈیلیٹ کیونکہ آپ کو نیو کی نیو کال ہوتا ہے، آپ کا نیو کال ہوتا ہے، آپ کا نیو کال ہوتا ہے اور یہ بھی آگے چلیں کہ نیو کے اندر بھی آپ گلوبل نیو کال نہیں کر سکتے ہیں وہ چھپ گیا ہے، once and for all once you define your own global level new operator you have hidden and made inaccessible the new operator provided by the language so you have to be careful with that nonetheless اگر نیو اپریٹر کلاس کے اندر ہم دیفائن کریں، یہ کلاس کا ممبر اپریٹر ہے then things are alright because جب اس کلاس کا آپ ساتھ آپ نیو کال کال کریں گے let's say ڈیٹ ہم نیو objects ڈیٹ کر رہے ہیں تو پھر ڈیٹ کلاس کا نیو اپریٹر کال ہو جائے گا on the other hand ہم نکل کے کوئی انٹیجرز کی ڈیٹ کر رہے ہیں using new تو جو global new تھا جو لنگوچ کے ساتھ آیا تھا وہ والا کال ہوتا رہے گا now by making new a member function of a ڈیٹ کلاس we have a safety it is global still available ڈیٹ کلاس کے لیے جو بھی ہم نے special کام کرنا ہے وہ نیو کے اندر کر لیں تھوڑے سے rules کی بات ہو جائے جب بھی ہم نیو کو overload کرتے ہیں تو نیو کی return ڈیٹ ہے that must be a void pointer so it is void star اور پھر اس کا ایک argument بھی دیا جاتا ہے which is size t size size t یاد رہے ہے is a data type internally defined کے جی the largest whole number جتنا بھی ہمیں چاہی ہوگا وہ اس data type کے اندر پورا آسکتا ہے so new کو ایک whole number argument دیا جاتا ہے usually an int and it always returns a void star یعنی void pointer this rule is true whenever you want to overload new یہ آپ کا syntax کائم رہے گا new کے اندر آپ جو بھی کرنا چاہے ہم c alloc یا m alloc call کر لیں جو کے c کے built in memory allocation functions تھے ان کے اندر testing کرنا چاہے کر لیں memory کے اندر کوئی چیزیں لکھنا چاہیں c alloc call کر لیں تو memory will be initialized to all zeros we can do that and we return a pointer to the allocated memory which is always of void pointer type delete جو ہے operator جب بھی ہم overload کریں گے it returns nothing so it's void but it always takes as an argument a void pointer وہی چیز جو کے new کے ساتھ ہمیں ملی تھی وہ آپ delete کو دی جاتی ہے so these are the rules whenever you're writing new and delete and the same rules apply whether you're writing them inside a class as member functions or outside a class which means you're overloading or overriding the global new and delete so be aware of that جب بھی ہم یہ new or delete جو ہے classes کے ساتھ استعمال کر رہے ہوتے ہیں so we have to be careful to understand what is the sequence of events that is happening جب بھی ہم اپنا new یا delete لکھتے ہیں کسی class کے لیے یعنی we write it as a member operator what happens is کہ پہلے memory کا ایک block allocate ہوتا ہے اور memory block allocate ہونے کے بعد constructor call ہوتا ہے اسی طریقے سے جب بھی ہم اپنا delete لکھتے ہیں تو پہلے destructor call ہوتا ہے یعنی reverse sequence چلتا ہے پہلے ایک object destroy ہوتا ہے اور پھر اس کی memory جو ہے وہ free store پے واپس رکھتی جاتی ہے what does this mean it means کہ ہم نے static کا key word جو ہے ان کے اندر استعمال نہیں کیا ہم نے تو سمجھ لکھتی ہے void star date colon colon operator new اور آگے size t size یہ اس کی declaration تھی new operator کی and what that read is کہ یہ date class کا member operator ہے اس کو ایک size دیا جا رہا ہے کہ یہ اتنی memory ہمیں allocate کرو اور یہ return کرے گا void pointer لیکن یہ کام کر رہا ہے like a static function what is a static function جب بھی ہم کوئی member functions یا member operator static declare کرتے ہیں then it can only access and manipulate static members of the class static data members کو وہ manipulate کر سکتا ہے actual data members کو وہ ہاتھ نہیں لگا سکتا if you think about it جب ہمارا new call ہوا class کا member operator اور وہ memory allocate کرنے گیا تو اس وقت تو ابھی object exist ہی نہیں کرتا تھا اگر کوئی object exist نہیں کرتا تو اس کے کسی بھی data member کو ہاتھ نہیں لگایا جا سکتا لہذا اس operator کا behavior is exactly like that of a static function جب وہ memory واپس آگئی پھر constructor چلا اور constructor چلنے کے بعد objects create ہوئے وہ اس memory میں ہی create ہوئے جو کہ new نے واپس کی تھی اور پھر assignment ہم جو بھی کریں اسی طریقے سے اگر ہم delete کو دیکھیں تو delete سب سے پہلے objects کو destroy کر دیتا ہے اگر objects پہلے destroy ہوتی ہیں اور پھر memory deallocate ہوتی ہے that means that objects no longer exist when we are trying to deallocate the memory تو the delete operator also looks like a static member operator or a static member function اور syntax ان کا یاد رہے کہ جی new وہ void pointer return کرتا ہے اور delete وہ void return کرتا ہے it returns nothing but it takes a void pointer as an argument یہ اپنی بیحیوئر کو نیو اور delete ہم دیکھیں جب ہم نے new کو انٹردوس کیا تھا تو I mentioned that it was more powerful and more elegant than calling the standard C type memory allocation functions malloc caloc یا realoc کیونکہ وہ void pointers return کرتے تھے اور ہمیں cast کرنا پڑتا تھا to a pointer of the correct type یہاں پے اب اگر آپ اوورلوڈ کرتے ہیں as a non member or as a member function new جو ہے now void pointer ہی return کرے گا when you do it in the class then it is automatically taken care of وہ void pointer return کرے نہ کرے اس کے اندر ہی casting ہو جاتے اور آپ کو objects مل جاتے ہیں but if you write global new outside the class then be careful it now behaves like the older C functions they return a void pointer and then you must cast it to the appropriate type let us go on and think about what about arrays can we allocate new کے ساتھ arrays inside a class یعنی is there a way of allocating multiple objects using new the answer is we can always do that لیکن اس اپریٹر کو بھی آپ کو بتانا چاہئے کہ جی یہ new جو ہے یہ array کو allocate کرنے جا رہا ہے بجائے کہ یہ ایک object کو allocate کرنے جا رہا ہے so اس کے لیے we use the array notation again کہ new کے ساتھ آپ square brackets لگاتے ہیں اور delete بھی جو overload کر رہے ہیں اس کے ساتھ square brackets لگاتے ہیں now what that means is that if you are overloading new and delete for your own class you will probably write two different types of new ایک جو ہے جوکے simple memory allocate کر کے آپ کو ایک object دے دے گا اور دوسرا new جو ہے ایک array of objects کے لیے memory کریٹ کرے گا اور array of objects کے لیے constructor call کرے گا اور آپ کو دے دے گا now جب ہم global new استعمال کر رہے تھے we found the syntax was very simple and we just used کے delete کے ساتھ یاد رہے کہ the array operator جو ہے وہ استعمال کرنا چاہیے یہاں پے it is now our responsibility to provide different types of new and different types of delete تاکہ overloading properly complete ہو سکے چلیں آئے زرا new اور delete کو چھوڑتے ہیں اور تھوڑا سے ایک اور نیا اوپریٹر overload کر کے دیکھتے ہیں یہ overloaded operator بزات ہے خود array operator ہے دیکھیں ایک بڑا standard سا problem آتا ہے problem یہ آتا ہے کہ ہم نے ایک array declare کی let's say 10 integers کی نیچے جاکے جب ہم ایک loop میں وہ integers یا get کرنے لگے یا ان کو display کرنے لگے یا کچھ computation کرنے لگے تو loop جو ہے وہ شہد 0 سے لے کے سو تک چل جائے آپ کے code پر دپنٹ کرتا ہے وہاں پہ کیا لکھا ہوا ہے and you might actually run off the end of the array array 10 کی تھی اور آپ انڈیکس کرتے جا رہے ہیں گیا رہا بارہ تیرا چوڑا and so on that's an error that the compiler may not catch why not think about it یہ نہیں اوپر میں نے کہا انٹ آئے 10 نیچے اگر میں لکھتا ہوں for i equal to 0 i less than 100 increment i تو آج کلکہ جو نئے compilers ہیں بھائی اور لاج اس ارر کو پکر لیں گے جناب آگے اگر میں نے لکھا ہوا ہے i array of i تو some intelligent compilers may catch this error how by looking at the size of the array that was declared and looking at the loop counter and saying hey you're running off the end of the array but the problem is کوئی لازمی تو نہیں ہے کہ ہم جو for loop لکھ رہے ہیں اس کے اندر 100 ہی لکھا ہو وہاں پہ کوئی ویریبل بھی تو آسکتا ہے for i equal to 0 i less than to upper limit او اپر لیمٹ کی کیا ویلیو ہے program کے اندر کہیں دیفائن ہوئی ہو it becomes very difficult and it's a common programming error کیا ہی اچھا ہو کہ ہم جہاں پہ لکھرے ہوں i array of i جیسے ہی ہم لکھیں تو کوئی جادوی ایسا چل جائے کہ جناب i array of i اگر تو valid index ہے اس ارے کے لیے تو کوئی value return ہو ورنا کوئی ایرر کال ہو جائے یا ہمیں report کر دیا جائے اس کام کے لیے جو array operator ہے in square brackets ان کو بھی overload کیا جا سکتا ہے اب تھوڑا سا اس کی overloading کے لیے we have to understand وہی بات کے جی پہلے اپریٹر کو کھول کے دیکھا جائے کہ جی کیا چیز return ہوتی ہے اس نے کیا کرنا ہے جب بھی ہم کہتے ہیں وہی اگرامپل لیتے ہیں انٹیجرس ہیں i array ہے اور اس کے 10 elements ہیں جب ہمیں i array of 5 کیا کہتے ہیں کہ ہمیں 6th element of the array کیا کہ چھےمہ انٹیجر اس ارے میں سے اس کی value کی بات ہو رہی ہے اگر ہم array operator لکھنا چاہتے ہیں کہ جب ہم لکھیں i array square bracket 5 square bracket closed تو بجائے built-in array operator کال ہونے کے ہمارے والا overloaded array operator وہ کال ہو تو وہ اپریٹر return کیا کرے گا اپریٹر return کیا کیا کرے گا اس کے اندر جاکے ہم کیا کریں اس لیکن ہم نے شروع اس پاس دے کیا کہ جی تاکہ ہم ڈیکس نہ دے بیٹیں اپریٹر کیا کرتے ہیں تو آپ پہلے اپریٹر لیتے ہیں اپنے بہت کیا کہا جو دیئے ہوتا ہے کہ جب بھی ایرے کے دیفائن کر رہے ہیں تو اوپر ایک شارپ دیفائن کے ساتھ ایک کنسٹنٹ دکھا دیں جس کو پھر استعمال کریں ایرے کی دیکلیریشن کے اندر اگر ہم اوپر کہہ دیتے تھے شارپ دیفائن میکس نم ٹین اور پھر کہہ تھے انٹ آئے ایرے میکس نم اور پھر سٹائل کے طور پہلے میکس نم اوپر کہہ دیتے تھے کیونکہ وہ شارپ دیفائن کے ساتھ میکس نم ایک کنسٹنٹ تو ایرے کی دیکلیریشن میں وہ استعمال ہو سکتا ہے اب جب ہم آئیں گے ایرے اپریٹر کے اندر we have a number or a value to compare it against so جب انڈیکس آپ نے دیا تو آپ سیدہ سی دیکلیرشن کے اندر اگر ہم اوپر کہہ دیتے تھے شارپ دیفائن میکس نم ٹین اور پھر کہہ تھے انٹ آئے ایرے میکس نم جب انڈیکس آپ نے دیا تو آپ سیدہ سیدہ اف سٹیٹمنٹ کے ساتھ چیک کر سکتے ہیں کہ جو انڈیکس آیا ہے وہ میکس نم ٹین یاد رہے zero based indexing ہوری ہے اس سے بڑا تو نہیں اگر بڑا ہے you could simply display an error message saying invalid index called otherwise you would return a reference to the value at the correct index location so this is a nice way of overloading the array operator یہی چیز objects کی arrays کی اندر بھی کام آئے گی and it is very important when we working with more complex data structures جو کہ آپ آئندہ courses کی اندر پڑیں گے کہ جب آپ ایک data structure بناتے ہیں اور اس کی array بنا لیتے ہیں تو کئی دفعہ آپ کو چاہیے ہوتا ہے کہ the array میں suffer کیا جائے we want to traverse an array from beginning to end or from end to beginning or do some things with it what we never want to do is کہ جی array میں next next next کرتے جائیں اور next کر کے array کے end سے باہر گر جائیں you do not want to do that لیکن next جو میں نے لفس استعمال کیا ہے is a very important operation it is like saying کہ جی اس وقت جہاں پے بھی میں ہوں اس سے اگلہ نمبر مجھ دے دو یا اس سے اگلہ object مجھ دے دو so next will be used previous will be used whenever we are using next we are saying current index plus one کی value دے دو and if we normally use جو built-in array operator ہے تو ہمیں یہ نہیں پتا چلتا کہ current index plus one جو ہے وہ valid location ہے کہ نہیں array کے اندر اس کے لیے اگر ہم یہ overload کر لیں array operator کو so we can do the error checking the same thing happens to previous کہ جی جہاں پے بھی ہم ہیں اس سے previous object ہمیں مل جائے تو ہم index minus one کو دھون رہو تھیں what happens if index is zero at that time well index minus one would have gone off the beginning of the array which is another error so again we can trap that inside our overloaded array operator آئیے اس int array کو ہم ایک class بنا کے اس کے ساتھ دیکھتے ہیں کہ جی اس کی array manipulation کیسے کی جاتی ہے suppose we create a class called int array اور ہم کہتے ہیں کہ جی this is a class جس کے objects will hold arrays of integers اس کے data members جو ہیں بڑے سیمپل ہیں ایک ہے length it's an integer اور وہ بتایا گا کہ جی اس integer array کے اندر کتنے نمبر ہم نے store کیا ہوئے ہیں اور دوسرا is simply a pointer that points to the beginning of the array that we have allocated so we can say iptr so int star iptr is the other data member مزے کی چیز یہ ہے کہ کیونکہ یہ ایک array allocate ہوگی اس object کے اندر ہم اس کو index بھی کرنا چاہیں گے جیسے عام array کو کیا جاتا ہے حالہ کے اندر تو ایک pointer پڑا ہوئا اور constructor کے اندر ہم جگہ allocate کریں گے تو یہاں سے اگر ہم جمپ کریں اور ہم اپنے main program میں آئے تو اس کی پہلی لائن اگر دیکھیں تو ہم کہیں گے int array i parentheses کے اندر 10 which says all we want is an integer array object that holds 10 integers in an array format اور پھر ہم چاہیں گے کہ i of 0, i of 1, i of 2 کر کے اس کو استعمال کیا جا سکے i now is not an integer it's an object اور object کیا index ہم استعمال کرنا چاہتے ہیں so in a way what we want to do is to overload the array subscripting operator inside this class اور پھر جیسے میں نے یہ چیزیں اس کو overload کرتے وقت ہم یہ array کے bounds کی چیکنگ وہ build in کر دیں گے class کی اندر so what we do is we write that member operator which returns a reference to an integer and takes an index as an argument goes in checks against the bounds of that array کیونکہ ہم نے object بنایا ہے کیونکہ array کی length is a data member so we can straight off check کہ جو index دیا گیا ہے element کا وہ کیا ہماری length سے بہر تو نہیں ہے it is not less than zero and it is not greater than or equal to length zero based indexing ہے so the valid values for the index will be zero to length minus one that is how we will define this array subscript operator within the class once we have created the object we can just go and use it because it is using a reference it is returning a reference we can use it in any loop like an ordinary array so we can write for j equal to zero j less than or whatever number we have given up top increment j or pure i of zero i of j equal to whatever value we want so we can always use this as an ordinary although the use is an object and the object is indexing inside you should carefully study this example because it illustrates an interesting concept the object we have not created an array of objects we have created an object and it is allocated inside normally we do it with dynamic memory allocation look at the constructor whenever we write in the main program i 10 then it allocates the place of 10 integers with a new operator its starting point it keeps it in the IPTR it initializes the length to the value 10 and now we get something which is actually a single object but behaves like a well behaved array when I say a well behaved array what I am talking about is that inadvertently you cannot give the index wrong just to prove to yourself کہ جی انڈیکس غلط دیا جا سکتا ہے why don't you write a simple C program آپنے لیے ایک انٹیجرز کی ارے دیکلیر کریں ordinary array not an object اور پھر اس کو انڈیکس کر کے آپ پرنٹ کریں کہ جی 10 انٹیجرز کی ارے آپ نے allocate کی ہے اور 11 یا 12 انٹیجرز کو پرنٹ کرنے کی کوشش کریں normally you will find because we don't know کہ وہاں پہ value کیا ہے but کوئی program میں error generate نہیں ہوتا printing تو ویسے ہی because پڑا اور لکتیا لیکن writing is a very dangerous operation what happens if we were to write into illegal memory locations ہم کہتے i of j j is the index is equal to 20 اور index کی value ارے کی bound سے بہر ہے اور جگہ پہ memory میں کوئی value لکھ رہے ہوں گے now unless bounds checking is being done at run time it is quite possible that you write into a memory location جو کہ صرف آپ کے control میں نہیں بلکہ کسی اور program کو crash کردے یا پورے computer کو crash کردے اس لیے when we use a subscripting operator اپنا جب define کرتے ہیں we make arrays very elegant and safe to use لیکن اس ایک سامپل is an important one کیونکہ اس کا بھی استعمال بعد میں کافی ہوگا you should study this well ایج ہم نے کن کن چیزوں کی بات کی ہم نے شروع کیا by talking about arrays of objects arrays of objects جو تھے میں نے بتایا کہ کیونکہ یہ user defined data types ہیں we can actually declare arrays of these data types یاد یہ رہے کہ جب بھی array declare ہوتی ہے تو her array member کے لیے constructor call ہوگا جب آپ کا program ختم ہوگا یا array destroy ہوگی تو ہر object کے لیے اس کا destructor call ہوگا so it is sequential and it happens for each object جب آپ array declare کرتے ہیں اگر آپ اسی وقت initialize کرنا چاہیں objects کو تو آپ کر سکتے ہیں using either a constructor call or by using some explicit values for example اگر constructor کو آپ کے پاس ہوں تو object class کے لیے جہاں پہ ایک argument سے object create ہو سکتا ہو then you can provide a list of those arguments only without explicitly calling a constructor and you will get an array of objects created and properly initialized اس کے بعد ہم گئے کہ arrays کو dynamically بھی allocate کیا جا سکتے ہیں objects کی arrays کو and we found that we could do that by using the new operator and therefore using the new operator you could actually allocate enough memory for all of the objects that you needed اور وہ memory جب allocate ہو جاتی ہے اس کے بعد ہر object کے لیے constructor call ہونے لگ پڑتا ہے difference یہاں پہ یہ تھا کہ جب new کے ساتھ ہم memory allocate کرتے ہیں اس وقت آپ کوئی initialization arguments نہیں دے سکتے default constructor ہی call ہوگا اسی طریقے سے جب delete call ہوتا ہے تو delete پہلے destructor کو call کرتا ہے any objects are deleted and then the memory is freed so you have to be careful that whenever you are using new to allocate memory for arrays of objects then when you go to delete you must use the delete operator with the array notation اگر آپ یہ نہیں کریں گے تو صرف پہلے والے object کی memory properly destroy ہوگی کیونکہ ایک destructor call ہوگا جب آپ delete کے ساتھ array notation یعنی square brackets لگا کے call کرتے ہیں تو پھر اس کو پتا ہوتا ہے کہ یہ ایک array delete ہو رہی ہے it goes back looks at کہ کتنے objects کیلئے یہ جگہ allocate کی گئی تھی اتنی دفعہ destructor call ہوں گے اور پھر وہ memory جو ہے واپس freestore کے اوپر دال دی جائے گی we went on and we looked at the usages of new and delete and we said that we can even overload these operators اور overload کیلئے میں آپ کو کچھ examples دیے اور کچھ ہم ہود کرنا چاہتے ہیں کہ جی اپنا new لکھیں یا اپنا delete لکھیں global new and delete کو overload کرنے کے اوپر میں تھوڑسی warning بھی دی کہ اگر یہ کریں گے تو جو c++ آپ کو provide کرتی ہے new and delete وہ کبھی نظر نہیں آن گے آپ کے program میں اور آپ والے overloaded new and delete ہی استعمال ہوتے رہیں گے اس کی downsides بھی ہیں جی اب new بھی void pointer return کرتا ہے pointer of the correct type return نہیں کرتا because it overloads every type of new لیکن اگر آپ global new or delete سے ہٹکے اگر کلاس کے اندر اپنا new function لکھیں یعنی it's a member operator then it's all right only for members of that class when we create objects they will call the class member new باہر سے کوئی اور کسی class کا type یا native data type کو اگر new کے ساتھ memory allocate کر رہے ہیں تو جو c++ کا built-in operator ہے پھر اس کے کچھ لوازمات تھیں and finally we looked at a very important operator which was the array operator array subscripting operator square brackets بزاتے خود ہم دیفائن کر رہے ہیں کہ the array کو index کیسے کرنا ہے and this is very useful اور ایندہ جو آپ پڑیں گے جب data structures کا course تو اس میں بھی دیکھیں گے کہ یہ آپ کے بہت کام آئے گا کہ array میں آگے پیچھے چلنے کے لیے جو آپ کا اپنا لکھا وہ operator ہے وہ bounce checking کر دیتا ہے جو آپ کو کوئی ایرے کی bounce checking نہیں کرتی ہے I think that was quite enough for today Please study the handouts and look at the reference material that we have put on the learning management system to understand most of these topics a lot of reading and a lot of practice is required so till next time حدہ حافظ