 اسلام علیکم، آج ہمارا CS201 انٹردکشنٹو پروگریمن کا 28 لیکچر ہے آج ہم جو پسلی دفعہ بات کر رہے تھے کلاسز اور آبڈیکس کی اور کنسٹرکٹرز اور دسٹرکٹرز کی اس کو لیکھے زرہ آگے چلیں گے لیکن ایک different perspective کے ساتھ آج ہم C++ میں memory allocation کے بارے میں بات کریں گے C++ میں memory allocation کیسے کی جاتی ہے کیوں جاتی ہے جو آج ہمیسٹردکٹرز کے بارے میں ساتھ بھی مجھے آپ کو بھی بہت ہونے کا تقریب ہے میں بھی کبھی بہت ہونے کیا ہے اور پھر ان کو اس طعم کیسے کیا جاتا ہے اور پھر کلاسز اور آبڈیکس کے ساتھ اس کا استعمال کیسے آتا ہے before we get into this way of memory manipulation it would be nice to know کہ جی اوپڈیکٹس کیا ہم صرف کلاس کے ساتھ صرف اوپڈیکٹسی کریٹ کر سکتے ہیں یا کچھ اور بھی کر سکتے ہیں آن سر ہے you have to think back to structure دیکھیں جب ہم نے structure defined کیے تھے تو ہم نے بات کیتے ہیں تو ایک تو structure εν سے ہم ایک data structure  کر لیکنے لیتے ہیں but we could also have a pointer to a data structure ہم جا پتا ہے i mean life is not that simple pointers are not going to go away وہ اماری زندگی کا بھیصہ بنگے ہوئے سب ہم ان ملےگ دی resolving ڈے ملےگ یہاں تأہم جانب ہوتا ہے اور DAY1 Grids اسن креп amendments جانب ہے میں ڈ dość دہ ملےگ دہ گا ڈores Nice تہک matters ہاری پاس بہات word ڈہ ملے گا بات سوئی ڈوبٹ جانب ڈوبٹ زرا کیا ڈوبٹ صاری اپجیکت نیم ڈوٹ میمبر نیم، ڈیٹا ہو یا فنکشن ہو، اس طرح ہم استعمال کرتے تھے اور اگر سٹرکچر میں پوائنٹر ہوتا تھا یا یہاں پہ کلاس کا پوائنٹر ہے تو اس کے ساتھ ڈوٹ اپریٹر کی بجائے اپنے کچھ فنکشنز انٹروڈیوز کیئے تھے، ایک تھا میلوک، امیلوک، پھر ڈیلوک تھا، پھر ڈیلوک تھا اور ان کے ساتھ ہم نے بتایا تھا کہ جی آپ میمری میں پرگرم چلتے وقت یعنی پرگرم جب چل رہو اس وقت آپ ہیب سے کچھ میمری ڈیلوکیٹ کر سکتے ہیں یہاں پرگرم جب آپ پرگرم لکھتے ہیں، اس وقت لازمی نہیں ہے کہ آپ کو پتہ ہوکے کہ کتنی میمری چاہیے ہوگی اور کلاسیک اگزامپل ہوتا ہے کہ ہم کمپائل ٹائم کے وقت اس کو بتاتے ہیں کہ یہ ایک سٹرنگ ویریبل ہے یعنی ڈیلوک تھا اور ایرے بنا لیتے ہیں یعنی ایک ویریبل کے اندر ہم کچھ ڈیٹا ڈال کے اس کو انشلائس کر لیتے ہیں تو جو ڈیٹا ہم نے ڈال کے انشلائس کیا یعنی ایرے کا سیز ہم نے بتا دیا that is fixed at run time we cannot increase that آپ کو یاد ہوگا for ڈیلوک کو لیتے ہیں کہ ڈیلوک کو ہم بتاتے تھے کتنی بائٹس چاہیے ہمیں میمری میں سے اور وہ بائٹس کے لیے پھر ہم کچھ کالکلیشن بھی ڈال دیتے تھے کئی دفعہ ہم یہ کرتے تھے کہ جی کتنی جگے چاہیے ہیں اور پھر ایک جگے کو کتنی سپیس چاہیے so we use something like I need 10 of type integer انٹیجر کو کتنی چاہیے جگے ہم size of operator استعمال کرتے تھے اور size of سے int لے لیا اس کو multiply کر دیا by 10 اور وہ argument pass کر دیا میلوک کو میلوک نے 10 times the space required by an integer وہ ہیپ میں سے ہمارے لیے allocate کر دی so it is just bytes کوئی initialization ہی ہوئے کچھ نہیں ہوا صرف میلوک میں سے ایک جگے reserve کر دی گئی ہے میلوک return کیا کرتا تھا it returned if you remember a void pointer a pointer that points to void type of memory whatever that means یعنی استعمال سے پہلے ہمیں اس memory pointer کو cast کرنا پڑتا تھا یعنی اگر ہم نے integers استعمال کرنے ہیں تو پھر ہمیں int star والی cast پہلے اس کے اوپر لگانی پڑتی تھی before the malloc function اور پھر ایک integer pointer کو assign کر کے اس کو ہم استعمال کرتے تھے یعنی کافی ساری ہمیں house keeping کرنی پڑتی تھی we had to determine how many bytes we needed so that was the argument that we passed to malloc then it returned a void pointer and then we had to cast the void pointer to the right type of pointer and then assign it to a variable pointer and then the last point which is also very important کہ جو memory allocate کی گئی تھی وہ initialized نہیں ہے وہ as is heap سے اٹھا کے اس کو آپ کو دیدی گئی ہے it can contain garbage the other half of these memory allocation functions was the free function کہ جی free کے ساتھ اگر آپ نے چلتے پر یعنی run time پے اگر کوئی memory allocate کی ہے تو اس کو free کرنا جو ہے وہ آپ کی responsibility ہے as a programmer this responsibility of course is not going to go away with these new functions but you will notice that the new functions are far easier to use and more self-explanatory let us look at کہ جی c++ میں memory allocation کیسے کرتے ہیں؟ the memory allocation in c++ is done with the use of the new operator Notice میں نے اس کو operator کہا ہے ملوک جو تھا وہ function تھا let us see اس کا syntax کیا ہے new کے ساتھ ہم for example simple لے لیتے ہیں کہ میں نے ایک integer کیلئے جگے رکھنی ہے memory کے اندر run time پے allocate کرنی ہے all I have to write is new space int new operator allocates enough space in memory for one integer and returns something what does it return? it returns a pointer to an int how is that for intelligence؟ یہ نہیں اس کو میں نے کہا کہ جی ایک integer کیلئے جگہ سٹور کرو اس نے نہ صرف integer کیلئے جگہ سٹور کی بلکہ a pointer to an integer واپس کر دیا جو کہ مجھے cast کرنے کی ضرورت نہیں ہے so in my program I could do something like int star IPTR which means IPTR is a pointer to an integer اور نیچے جاکے میں کہا دوں IPTR is equal to new int that's it no cast no fancy brackets no size of operator no how many bytes are needed everything is done for us so new is very elegant new کو میں کہا دوں new 4 it allocates enough space for one character new double it allocates enough space for a data of type double return کیا کر رہا ہے appropriate data type کا pointer so it does lots of things for us which malloc ncloc etc were not doing new کے ساتھ memory free کرنے کا function کیا ہے یا operator کیا ہے وہ ہے delete so جب بھی آپ new استعمال کریں گے کہی نہ کہی آپ کو delete لکھنا چاہئے so in this case اگر ہم نے کہا IPTR is equal to new int جب اس کا استعمال ختم ہو گیا we should say delete IPTR again interesting اس کو پتا ہے IPTR is a pointer to an integer and it will delete the memory that that points to یعنی free کر دیتا ہے وہ وہاپس free store پہ چلی جاتی ہے memory what else ابھی تک میں نے simple variables کی بات کی what about if I wanted to allocate space for an array and remember وہاں پہ زیادہ اس کا کام آتا ہے well array کے لیے it's even simpler all you have to do is after the new and the data type in square brackets you just put in the size of the array so for example اگر مجھے دس انٹیجرز کی array بنانی ہے or run type میں مجھے memory allocate کرنی ہے let's take the same old pointer so we have int star IPTR so IPTR is a pointer to an integer and now I want this pointer to point to a block of memory that can be used to store 10 انٹیجرز how do I write it I say IPTR is equal to new int square brackets 10 simple what it does is free store میں سے جاکے دس انٹیجرز کی جگیلی وہ allocate کر لی allocate اگر ہو گئی تو اس نے integer pointer return کیا جو ہم نے IPTR کو اسائن کر دیا اب اس کے ساتھ جو بھی ہم کام کرنا چاہے وہ کرلیں when we use this type of memory allocation notice that the memory being allocated is coming from جس کو پہلے ہم نے heap کہا تھا اور c++ میں اب ہم اس کو free store کہتے ہیں وہاں سے memory آ رہی ہے what happens اگر وہاں پہ کافی memory نہ ہو میںلوک آپ کو یاد ہوگا وہ null pointer return کر دیتا تھا یہاں پہ c++ میں 0 pointer return ہوتا ہے c++ میں 0 is used as the invalid pointer value instead of using null value وہی ہے اندھا تو 0 کی value ہوتی ہے but the convention is it uses 0 so again whenever we call new or something it would be good practice to check for the success or failure of the new operator and remember new is an operator it is not a function so new جب ہم استعمال کرتے ہیں اس کے بعد کوئی parenthesis وگرہ نہیں دالتے ہم لکھتے ہیں new پھر space پھر data type اور پھر اگر array بنانی ہے یا کافی multiple locations آئیں تو square brackets میں number of locations that you need کوئی size of operator نہیں استعمال ہو رہا کوئی آپ اس کو bytes کی بات کر ہی نہیں رہے ہم کہتے ہیں new double 10 تو وہ double precision numbers کو جتنی memory چاہیے اس کو زربے دس memory allocate کر کے ایک double کی پوانٹر جو ہے وہ ہمیں return کر دیتا ہے so it's a very useful and a very powerful function delete اس کے ساتھ چلتا ہے so if I say IPTR is new in 10 I say delete IPTR whatever memory was allocated and IPTR was assigned to it that memory is deallocated and returned to free store can we use this concept with classes and objects answer is obviously yes جہاں پہ ہم ایک ordinary دیتا طاپ کا پوانٹر کریٹ کر سکتے تھے میں نے already بتایا کہ we can have a pointer to a class in other words a pointer to an object توگر ہم پیچھے والی اپنی date class لیکے چلیں تو I can declare something like date star dptr اپنی dptr is a pointer to an object of type date number one ابھی تو یہ پوانٹر ہے so pointer as you know holds an address where is the object اپنی اپنی کریٹ ہی نہیں ہوا when will it be created when we use something like the new operator so let's go and create an object of type date using the new operator how do we do that لیکن ہم ایک کمپلیک سنٹکس right actually it's absolutely straight forward you would use exactly the same syntax جو کہ ہم نے iptr or integer کے ساتھ استعمال کیا تھا we would use something like dptr is equal to new date new space date again no parenthesis why can we do that remember the basic definition of a class it's a user defined data type in other words ہم نے language کو ہی extend کر دیا ہے look at the power we can now create data types of our own choosing once we have created those data types by defining them in a class we use them exactly as the native data types so new date that's quite fine date class defined ہے ایک ڈیٹ کے ڈیٹ کو جتی ممری چاہیے وہ free store سے allocate ہوگی اس ڈیٹ کا جو pointر ہے وہ return ہوگا اور dptr کو assign ہو جائے گا is that all that new is doing پھر ہم میلوک بھی استعمال کر لیتے تھوڑا سا فرق ہے کہ میلوک کو آپ کو کوئی size دینا پڑتا ہے پہلے تو آپ یہ چک کریں and confirm for yourself کہ یہ object of type date کہ یہ ممری لیتا کتنی ہے how do you do that well you already have the tool for that purpose and that is the size of function so if you were to say something like see out less than less than size of date کلاس کا نام لکھنے بیچ میں وہ آپ کو بتایا گا کہ date class نے کتنی ممری میں جگہ لینی ہے in our case we can create an object let's say date my date size of my date notice میں نے پشتلے لیکچر میں بات ہی تھی کہ جب ہم کوئی object کرتے ہیں کسی کلاس کا whenever we instantiate an object of a class the member functions occupy a common region in memory and the data members are each allocated enough memory for each object that we create so size of کو کیا چیز return کرنی چاہیے when we say size of my date which is an object of type date کیا چیز return کرنی چاہیے یا تو وہ return کرے کہ دیتا نے اتنی جگہ لی ہے functions نے اتنی جگہ لی ہے اور object نے ملا کے اتنی جگہ لی ہے now that would be logical except let's say I declared 3 objects I said date, date 1, date 2, date 3 اب size of کیا return کرے گا problem is or rather I mentioned earlier کہ functions تو ایک ہی دفعہ memory میں آئیں گے اور پھر date object appropriately functions کو call کرے گا اپنے data members کے لیے size of operator جو ہے وہ date storage جو ہے object کی اس کا size return کرتا ہے ہمارا جو date object تھا یا date class تھی اس کے اندر ہم نے 3 integers دیفائن کیا ہوئے تھے int month, day, or year لہذا اس کا size of وہ 3 integers جتنی storage ہے interesting but nice functions extra space نہیں لیتے functions تو گئے وہ code میں شامل ہو گئے انہوں نے جتی memory لینی تھی وہ ایک دفعہ لیں گے data members are the ones that are replicated whenever you create new objects and the size of operator returns the size of the data members of an object back to our new operator جب ہم نے کہا کہ dptr is equal to new date تو memory کتنی allocate ہوئی اتنی ہونی تھی اگر malloc کو ہم size of date کے ساتھ ہم call کرتے یعنی automatically new نے پہلے date object اٹھایا any date class سے اس کی definition لی ہے اس کا data اندر کتنا پڑا ہوئے اور new کو automatically مل گیا کہ اس میں 3 integers کی جگہ چاہی ہے اس نے 3 integers کی جگہ memory میں allocate کی اور پھر اس کا pointer جو ہے وہ dptr کے اندر return کر دیا is that the only thing it is doing actually it's doing a lot more you see what it is doing is it is creating an object of type date malloc وگیرا کچھ نہیں کرتے they are simple functions وہ memory کا ایک block allocate کر کے اس کے شروع کا pointer وہ آپ کو واپس دے دیتے ہیں new جو ہے it actually goes and creates the object for you اگر new int بھی کہا تو اس نے ایک نیا integer کر دیا اور اگر کوئی rule ہوتے جی نیا integer جب بھی create ہو تو اس کی value 0 ہونی چاہیے یا 10 ہونی چاہیے تو وہ بھی ہو جاتی how does that or what does that imply for a class what it implies is اگر new operator کے ساتھ آپ ایک class کو object instantiate کرتے ہیں تو اس object کے لیے constructor call ہو جاتا ہے now isn't that nice یعنی ایک block of memory جو malloc ہمیں واپس کر رہا تھا اس کو memory کو ہاتھ بھی نہیں لکا تھا جو کچھ بھی بیچ میں garbage لکھی ہوئی تھی اس کا ایک pointer return ہو جاتا تھا اب new کے ساتھ جب ہم object create کرتے ہیں تو object کا constructor بھی call ہو جاتا ہے constructor کو وہ جو memory allocate کی گئی ہے وہ pass ہوتی ہے اس کے اندر اگر constructor میں ہم کوئی بھی initialization کرنا چاہتے ہیں اور ہم نے date کے لیے initialization ڈالی تھی بیچ میں تاکہ کوئی valid values ہو وہ automatically اس memory space میں لکھی جاتی ہیں اور پھر جب آپ کو pointer ملتا ہے pointer بھی اس کلاس کی type کا pointer ملے گا کوئی cast کرنے کی ضرورت نہیں ہے and the pointer now points to a valid object an object that now has valid data inside it very very powerful malloc وگیرا کو اب سب بھول جائیں new operator کو استمال کریں we have allocated space for the object we have called the constructor for the object sorry let's go back we have allocated space for the object without telling the program کتنی جگہ چاہی ہے the new operator has automatically determined کتنی جگہ چاہی ہے then it has called constructor for the object when it calls the constructor for the object it automatically hopefully we have written the constructor to initialize the data space I'll pause here for a second and remind you اگر آپ Constructor Provide نہیں کرتے تو c++ default constructor Provide کر دے گی اور وہ آپ کے object کو جس طرح بھی ہے create کرے گی لیکن the default constructor will not perform any initialization for you لیکن it is good practice that whenever you write a class you write a constructor that initializes the data into some meaningful shape going back to the new operator size of not needed کتنی جگہ چاہی ہے constructor automatically called so it will automatically initialize the data values inside the object to whatever we have put in the constructor and then it returns a pointer correctly cast to an object of type date اور اس کو ہم ایسائن کر دیتے ہیں pointer کو اور استعمال کرنے لگ بڑتے ہیں so extremely useful extremely powerful and a good way of allocating memory میں نے ابھی بات کی جب بھی ہم new کے ساتھ ایک object create کرتے ہیں تو اس کا constructor call ہو جاتا ہے پچھلی دفعہ ہم بات کر رہے تھے کہ جی constructor کے اندر آپ for practice کوئی see out کی statement لکھ دیں جو کہ آپ کو بتائے کہ constructor call ہوا ہے if you call وہ والی class استعمال کرتے ہوئے آپ new استعمال کریں گے تو آپ کو screen پر نظر آئے گا object of type date created if that was the string that you output with the see out that's proof کہ constructor was called get back again a little bit ہم نے کہا کہ جی اگر مجھے دس integers کی array create کرنی ہے اور اس کے لیے میں نے جگہ allocate کرنی ہے memory کے لیے memory میں تو I would say something like iptr where iptr is a pointer to an integer iptr equals new int 10 in square brackets and that would allocate that space for 10 integers can I do it with objects in a class in other words can I allocate memory for 10 objects or whatever the number answer is yes and the syntax is identical کوئی نیا طریقہ نہیں سیکھنے والا ہم کہیں گے dptr where dptr is a pointer to date they can a pointer to an object of type date dptr is equal to new date اگر دس ہم نے dates define کرنی ہے beast کرنی ہے تو square brackets میں beast لکھ دیں گے and so on have some fun write out the constructors as I mentioned last time اس کے اندر see out statement ڈالنے see out ڈالنے کے بعد آپ اس طرح سے new کے ساتھ دس date کے objects کے لیے جگہ create کریں ابھی میں نے آپ کو یہ بتایا کہ جب وہ object create ہوتا ہے with the new operator پھر میں ہی دن ہے then the constructor for that class is called so when we say new date 10 which constructor how many constructors with this objects create ہورہیں of course وہ ایک کتے ہوں گے memory میں contiguous block ہی allocate ہوگا لیکن there will be 10 calls to the constructor you can do this write out this one line and see what happens on your output screen it will repeat 10 times جو جو پر کنستریکٹرadiaٹ کالدیت کالدیت کالدیت کالدیت کالدیت sourd دور جیساعد لیکن ہوری پر الشرٹی کو اپنی ہوری جگہ ہے کہ اپنے جو کتنا سارا کام ہے جو خانج دาہ کیا کتنا سارا کام ہے جو اس بهیلیڈر کو ڈیٹیے دیا ہر آپگی سے اپنی باشے گئی LEO انشالیز کیا پر کیا بیانگڈ کائنے کے بعد انشالیز کرنے کے بعد اس نے ٹکریکٹ شخصوں کا پورنٹر بھی واپس کر دیا lot's of uses. pointer ہمارے پاس object کا آگیا تو اس کے ساتھ ہم normal manipulation کر سکتے ہیں except یہ یاد رہے کہ جب ہم object کے ساتھ let's say member function call کرتے ہیں یا method کو call کرتے ہیں ہمارے پاس object تھا date one. تو ہم کہتے تھے date one dot set date function call کرنے کے لیے where the function name was set date. اگر dptr کو استعمال کرنا ہے in other words pointer to an object of type date then we will write dptr right arrow which is constructed by writing a minus sign a greater than sign and then the name of the function in this case set date. so we will use this notation which is called the arrow notation whenever we are using a pointer to access either member functions or member variables if they are public. you can't touch them if they are private only member functions can touch them but arrow operator will be used instead of the dot operator not very difficult صرف یاد رکھنے والی بات ہے compiler will also catch this so you can't inadvertently do something like dptr dot set date. اگر dptr pointer ہے تو compiler ہی آپ کو روک دے گا کہ جناب یہ construct آپ pointer کے ساتھ کال کر رہے ہیں member function کو you can't call it this way maybe a more intelligent compiler will tell you کہ جی ڈٹ اپریٹر نہیں استعمال کرنا arrow operator استعمال کرنا ہے so you have to do it that way it is exactly the same جو کہ ہم نے struct کے ساتھ بات کی تھی structures یعنی struct and classes in c++ are very very similar اب میں آج بتاتا چاہلوں کہ struct کے اندر بھی member functions ہو سکتے ہیں c++ میں c میں نہیں c میں struct was simply data c++ میں struct can have data as well as functions difference ہے visibility کا نظر کیا چیز آتی ہے بہر سے structure کے اندر default ہے کہ ہر چیز public ہے ہر چیز جو structure کے اندر لکھیں گے وہ بہر سے نظر آئے گی class کے اندر default private ہے جو چیز class کے اندر لکھیں گے you need data members your functions اگر کچھ اور نہیں لکھتے تو بہر سے کچھ نظر نہیں آئے گا so you have to provide the keyword public اور public کے بعد جو چیزیں دیفائن کریں گے وہ بہر سے نظر آئیں گی good programming practice کہ حالہ کہ default private ہے class کے لیے پھر بھی آپ private خود لکھیں تاکہ جب آپ کوڈ کو دیکھ رہے ہیں آپ کو دیریکلی نظر آئے کہ private یہ والا ڈیٹا ہم نے private کیا ہے اور یہ ایک utility function بھی ہم نے private بنایا ہوا ہے یہ بہر سے call نہیں ہوگا یہ کوئی اور member function اس کو call کرے گا اور پھر آپ public لکھیں یعنی public colon اور اس کے بعد جو چیزیں لکھیں گے class کے اندر وہ جو ہیں وہ بہر سے بھی نظر آئیں گی یعنی users of the class کو بھی نظر آئیں گی take that as a good guideline use the key words private and public پھر اگر flexibility کی بات کریں انی دو words کو لکھیں تو آپ ان کو دو بارہ سے استعمال کر سکتے ہیں class کے اندر you can say private xyz public abc and then again private rst or something like that but that's a bad idea you don't want to mix private and public so many times that the looking at the class becomes confusing اکتھا کر لیں پہلے private کو declare کر لیں پھر public کو declare کر لیں بس public کو اوپر کرنا چاہتے ہیں private کو نیچے کرنا چاہتے ہیں it's a matter of style and as I say style is your preference it is not a standard it is not a norm it is your preference آپ کا دل کرتا ہے کہ اوپر public declare کرنے ہیں پہلے چیزیں so class جب شروع ہو تو ساری جو بہر سے چیزیں نظر آنی وہ نظر آجائیں public اوپر لکھ لیں یاد رکھیں کہ public کے بعد جب private section declare کرنا تو private لکھنا لازمی ہے otherwise ساری چیزیں public ہی رہیں گی because once a private or a public keyword is used inside a class definition all following data or member functions retain that attribute because private سے شروع ہو گئے تو ساری چیزیں private رہیں گی جب تک public نہیں آئے گا ایک اور کیورڈ ہے وہ ہے protected لیکن protected ہمارے اس course میں ہم استعمال نہیں کریں گے that has to do with inheritance and inheritance falls into the domain of object oriented programming that's a separate course you will study it there so let's stay with the new and delete operators اور دیکھیں ہمیں new کے ساتھ بہر سے object oriented programming اور دیکھیں ہمیں new کے ساتھ بہر سے objects تو create کر لیے لیکن یاد رہے کہ new اگرہ کا function جو ہے that is more generic the function is to allocate memory تو question یہ ہے کچھ کلاس کے اندر constructor کے اندر new call ہو سکتا ہے کہ نہیں answer is obviously when I ask a question like this the answer is always yes usually it's yes but in any case objects بھی ایسے ہو سکتے ہیں جن کو dynamic memory کی ضرورت پڑے یعنی when we create the object تو مبھی اس کا size چھوٹا سا ہو بیچ میں جا کے ہم استعمال کرتے کرتے object کو موٹا کرنا چاہیں classic example would be let's say ہم ایک create کرنا چاہتے ہیں object of type student تو student کے ہم نے age or height ایس طرح کی چیزیں تو ints or floats کے اندر رکھنی what about the name نیم کے ساتھ ہمارے پر وہی quandary ہو جاتی ہے وہی مسئلہ پیش آ جاتا ہے کہ جی یا تو ڈے رکھیں fix size کی اور کہیں کہ جی سوہ کریکٹرز کی ڈے رکھ دی ہم نے نام کے لیے اور سوہ کریکٹرز سے لمبا نام کبھی نہیں ہوگا اور پتا چلے کہ جی majority of students ان کے نام 20 سے 25 کریکٹرز کے آ رہے ہیں so we are wasting a lot of memory on the other hand if we keep a pointer we can allocate memory at runtime how do we do that simple constructor کے اندر سے we would be calling the new operator or some other functions کے اندر سے ہم new operator call کر کے جتنی ہمیں memory چاہیے وہ runtime کے اندر object کے اندر شامل کر لیتے ہیں advantage یہی ہے کہ جی objects now are of variable size objects of the same class they are of variable size they only contain enough memory to hold the data appropriate for that object so کسی میں نام چھوٹی جگہ لیے رہا ہوگا کسی میں نام بڑی جگہ لیے رہا ہوگا کئیوں میں نام بہت لمبی جگہ لیے رہا ہوگا nonetheless یہاں پہ ایک responsibility آتی ہے وہ responsibility آتی ہے delete operator call کرنے کی how does that work دیکھے میں نے بات کی تھی کہ new جب بھی ہم call کریں گے تو it is our responsibility to also call delete when the job is over otherwise وہی جو memory leaks کی پہلے میں نے باتیں کی تھی وہ memory leaks یہاں پہ بھی ہو سکتی ہیں we allocate memory from the free store ہم نے program میں ہمیں memory مل گی ہم نے استمال کی اس کو return نہیں کیا free store کے اوپر pointer جو ہے وہ تو destroy ہو گیا لیکن کوئی automatically وہ memory free نہیں ہوتی so we must always call the delete operator now with an object جس کے اندر ہم memory allocate کر رہے ہیں it becomes important کہ object کے اندر سے بھی delete operator call کیا جائے جب object کی ہمیں ضرورت نہیں رہی where do we call it can you think about the location the location is obvious location will be the destructor of that class in destructor میں ہم وہ delete operator ڈالیں گے جو اس object نے memory لی ہوئی تھی جب اس object کا lifetime ختم ہو so delete operator call ہو جائے جتنی بھی memory اس نے allocate کی ہوئی تھی وہ free store کے اوپر واپس چلی جائے so that is the real use of destructors ابھی تاک تو ہم ایک fakes are used کہ this destructor call ہوتا ہے اور اس کو دیکھنے کے لیے کہ call ہوتا ہے کہ ہم نے a fake destructor لکلیا تھا جس میں ایک see out کی statement لکھی ہوئی تھی اب destructor بزاتے خود ایک function کی شیط لینے لگ پڑتا ہے اور جہاں پہ constructor میں ہم نے کوئی memory allocate کی using the new operator تو destructor میں delete operator call کرنا ہماری responsibility ہے and it is required please be very careful with that rule of thumb جب بھی آپ کے پاس کوئی ایک کلاس ہے جس کے data members کے اندر pointer ہے اور pointer کو ہم استمال کرتے ہیں by allocating memory at runtime then it is required that you also provide a destructor for that class یاد رہے جہاں constructor overload ہو سکتا ہے destructor overload نہیں ہو سکتا so there is only one destructor that one destructor must do housekeeping before the object is destroyed normal جو data members ہیں inch are float وگیرا وہ destructor میں ان کو deallocate کرنے کی ضرورت نہیں ہے وہ automatically destroy ہو جاتے ہیں لیکن جہاں پہ آپ نے memory allocate کر لی new کے ساتھ delete must be called so malloc کے ساتھ free ہم call کرتے تھے that was always in a pair اسی طرح new کے ساتھ delete call کریں گے it will always be a paired usage we will be calling them from different functions new will be called in a constructor and delete will be called in a destructor but think about it can new be called in something other than a constructor as you do why not and in fact we normally need to do that کس طرح سے کہ جی سپوز میں نے ایک student object create کیا اور student کا نام ہے عبدالخالک اس کے name field کے اندر میں نے new کے ساتھ عبدالخالک کے لیے جگہ allocate کیا اور وہاں value لکھ دی اب چھے مہینے کے بعد عبدالخالک ساب آتے ہیں کہ جناب اب تو میں student نہیں رہا میں تو graduate کر گیا ہوں اور graduate کرنے کی وجہ سے آپ میرے نام کے ساتھ bcs ضرور لکھیں اور کیونکہ ہم نے data تو اپنا رکھنا ہے تو اب میں عبدالخالک کے ساتھ bcs لگانا چاہتا ہوں لیکن مجھے جگہ زیادہ چاہی ہے اس کے لیے so how do I do it well یہاں پے I'm not going to give you the precise way of doing it but the logic is simple اگر ہم see میں یہ کام کر رہے ہوتے جو کرنی سکتے کیونکہ وہاں تو objects and classes نہیں ہوتی تو ہم realloc call کرتے کہ یہ والا data کائم رہے اور اس کی جگہ بڑھا دو یہاں پے ہمیں کیا کرنا پڑے گا کہ ہم نئی memory مانگے گے free store سے جو کہ original value plus the new data جب new ہمارے پس value آجائے گی اس میں پرانی value copy کر دیں گے اس کے ساتھ data جو append کرنا ہے وہ اس کے ساتھ append کر دیں گے so now نام تھوڑا سا بڑا ہو گیا اور پرانے والے کو delete کر دیں گے اور اس کو واپس لکھ دیں گے so it sounds complicated but the logic is straight forward allocate enough space for the new variable or the new data populate that space delete the previous space and put it back into the space occupied or the pointer that was pointing to the original data so ہم اس طرح سے run time کے وقت object کا size بھی بضل سکتے ہیں does this changing of the size of the data inside an object have an implication for the destructor no it has no implication because جو ہمارے new or delete functions ہیں your operators they are also very intelligent when you allocate space using new so I'll recap again کہ جی نا ہم نے اس کو بتایا کہ جی کتنی bytes چاہیے اس کو تو اگر میں نے new object طاپ دیدی تو اس نے object کے size کی جگہ دیدی اگر یہاں پہ جو an example میں لے کے چل رہا ہوں ہم نے actually a character array تھی تو ہم array کو بڑھائیں گے کیسے بڑھائیں گے آپ کو یادہ string functions آپ کے پاس ہیں کہ جی جو new string ہوگی اس کی length کالکلیٹ کریں اور پھر new کے ساتھ اور square brackets کے اندر وہ length کی value دے دیں جب آپ destructor میں آئیں گے تو you will just say delete فلانا pointer pointer کا نام آجائے گا جو بھی name hold کر رہا تھا اس کی جگہ جو ہے وہ واپس freestore پے چلی جائے گی whenever we are using arrays تو delete کے ساتھ ہم array کا symbol ڈال دیتے ہیں which is two square brackets so we say delete square brackets pointer name that tells the delete operator کہ یہ ایک array ہے جس کو واپس memory پہ ڈالنا ہے صرف ایک variable نہیں ہے جس کو ڈالنا ہے so ان کے ساتھ تو ہم آپ practice کریں گے کافی ساری چیزوں کی so new or delete جو ہے اس کو recap کرتا چلوں کہ صرف class کے باہر نہیں to create objects of the class on the heap or on the freestore but also from within a class we can call new which allocates data for the data members of a class at runtime that data belongs to an object which call this new operator so you can have student one with a different data size student two with a different data size student three with a different data size destructor ان سب کا وہ destructor ہے جو کہ class کا common destructor define کیا ہوا ہے وہ کہتا ہے delete square brackets نہیں پتا مجھے کہ کتنی جگے تھی وہ automatically determine کر لو اور آگے pointer کا نام وہ پوری جگے free ہو کے ہے when that object is destroyed again you can write yourself some functions a little class and try to experiment with this to find out کہ جگے ستور ہوتی ہے نہیں ہوتی delete ہو کے وہ memory پہ چلی جاتی ہے نہیں چلی جاتی but you might also be saying کہ جی اگر یہ new or delete اتنے ہی useful operators ہیں تو ہم نے ایک پورا lecture malloc my answer is knowledge is never wasted those were fundamental building blocks which were used in the sea language if you were to ask me کہ جی مجھے a file copy function لکھنا ہے تو most probably file copy کے لیے میں شہد malloc ہی استمال کرو it's a library function I can use it from within file copy and create یہاں پہ I would have to think differently object think جس کو کہتے ہیں when we speak and think differently آپ کو تھوڑا سا احساس ہونے لگ پڑا ہوگا کہ اب جب سے میں نے classes اور objects کی گفتگو چورو کی ہے تو main function کہیں صاید پہ بیٹھا ہوئے پہلے ہمیشہ ہماری اب ہم main کا ذکر کبھی کبھی کرتے ہیں کیا main کی ضرورت نہیں رہی main is very much there it is the starting point for all C as well as C++ programs but what will you realize as you go on and write your own classes آپ کو یہحساس ہونے لگ پڑے گا کہ جی اب نوے فیصد programming جو ہے وہ class کی definition کی اندر ہم کر رہے ہیں so class کیا ہوگی اس کے data members کیا ہوں گے اس کے methods یا functions کیا ہیں کنسی چیز private ہے کنسی چیز public ہے جب functions کی prototype سمنے دیدی تو اب functions کو define کرنے چلے ہیں functions کی definition یاد رہے class name colon colon function name parameter list اس طرح define کرنے outside the class اور یہ ہم ساری class کی programming کرتے ہیں now class کی programming complete ہو جاتی ہے اور اب ہم آتے ہیں main کی طرف تو بہتا چلتا ہے main تو 4 لینوں کا program رہ گیا main شروع کیا main شروع کیا date my date ساتھ کو initialization string دیدی my date dot display end of main ختم یا main 2-4 لینوں کا رہ گیا سارا کام class میں ہو گیا idea is reusability مینت وہاں پے کرو جس نے بار بار استعمال ہونا ہے whenever we create a class we have to think ahead اس کے users con con ہوں گے یعنی user any client of a class is the program that we write جو کے class کو استعمال کرتا ہے but users کی definition کو آپ بڑھا لیں users of a class is not just does not just include the main program that calls the class but and also include your colleagues the programmers around you آپ نے ایک بڑی زبر دست کسم کی class create کی ہے it is a creative thing writing programs is created یا the lecture 1 میں میں نے کہا تھا it's a creative exercise ہم کوئی چیز تخلیق کر رہے ہیں it is exciting writing a good class is also very very creative and very exciting so if you've written the latest wam bang class تو ہم آپ اس کو advertise کرنا چاہیں گے ہم کہیں گے یا تم کیا اپنا time ذایا کر رہو date class تو میں نے لکھ دی یہ low and encapsulated ایک چیز ہے یہ اس کا interface ہے interface ہی بتانے implementation تو بتانے کی ضرورت نہیں ہے implementation تو ہمارے object code کے اندر چھوپی ہوئی ہے یہ اس کو interface دیا تو ہم اپنے program میں استعمال کر لو and without knowing کہ جی اس implementation کے اندر variable names کیا تھے کیس طرح سے data رکھا ہوا ہے کیس طرح سے اس کو manipulate کیا ہوا ہے کیس طرح والی بات جو ہے وہ دوسرے programmer کو معلوم ہونے کی ضرورت نہیں ہے all they need to know is کہ جیس کا interface کیا ہے اس کے کسے methods ہیں اور methods کے ساتھ میں کیا چیز achieve کر سکتا ہوں as simple as that so you can advertise your work and then you can go for reusability advantage your main programs are very easy to read the logic becomes obvious I've created an object I've asked the object to do this notice I didn't say I've done this with the object what I said was I've asked the object to do this this is another way of thinking اب ہم نے object کو کہا ہے کہ جو بھی اپنے آپ کو display کر دو object کو کہا ہے کہ جو بھی اپنی یہ calculation کر دو so we're just asking it اس کو اگر آپ modern operating systems میں or windows بگیرہ میں جب programming میں جائیں گے تو یہ بھی بات سمجھا جائے گی کہ وہاں پہ اس کو کہتے ہیں messages ہم اب object کو message بھیج رہے ہیں which is the same or is the synonym for calling a method of the object اور method کا لفظ بھی اسی طرح استعمال ہو رہا ہے کہ جی وہ a method ہے کچھ کام کرنے کا کوئی طریقہ ہے so we send a message we call a method اور ہمیں بھی messages one messages two messages three end of program as I keep repeating it's a different way of looking at things I hope کہ آج کے لیکچر میں آپ سو نہ گئے کیوں because I have repeated many things many times most of the things that I mentioned in the previous lecture I have covered them again بل اس کی ایک وجہ ہے ایک یہ کہ ہم آپ کے سوچ کا اندار تھوڑا سا ایک مختلف سمت میں لجا رہے ہم آپ جانتے ہیں now take a turn and start thinking differently نمبر 2 at the beginning of today's lecture I gave you some philosophical reasoning for thinking about objects and how they manipulate themselves and how we have methods etc and I spoke about where you're going with that object-oriented databases and videos and audio etc ابھی کے لیے do we have something more exciting coming up or is this it اور باقی کا کور some constructors or destructors کی بات کرتے رہیں گے answer is lots of exciting things coming up اوبر لوڈنگ کے حوالے سے بہت ساری چیزیں ہیں let's step back a little bit دیکھیں سی کے اندر جب ہم نے native data types کی بات کی تھی تو یاد ہوگا کہ کمپلیکس نمبر اس میں نہیں تھے اگر آپ نے سی میں کمپلیکس نمبر کے لیے کوئی function لکھنے ہیں یا library لکھنی ہے تو آپ کو کمپلیکس نمبر بھی اپنا دیفائن کرنا پڑے گا نومالی سی میں ہم شہد سٹرکچر استمال کر لیں کہ جی اس کا ایک دبل real part ہے اور دبل imaginary part ہے لیکن سٹرکچر کچھ بھی نہیں ہے it's just a label for some data members اس کے بعد اگر دو کمپلیکس نمبر کو add کرنا ہے تو آپ کو اپنی basic math سے یہ پتہ ہوگا جب دو کمپلیکس نمبر add ہوتے ہیں تو ان کا real part real part کے ساتھ add ہوتا ہے اور imaginary part imaginary part کے ساتھ add ہوتا ہے c میں ہم اس کام کے لیے شاید ایک function لکھتے suppose the function was called c add complex add پھر اس function کو ہم دو argument pass کرتے complex number 1 or complex number 2 as an ordinary function if you would have done something like complex number 1.real plus complex number 2.real یہ real part ہوگا اور پھر اسی طرح اس کا imaginary part ہوگا اور پھر ہم ان values کو کسی or variable میں store کر کے واپس آتے تاکہ ہم کہیں پے اس کو assign کر سکتے یا ہم کہتے کہ جیسی add اس کو 3 complex numbers pass کرو structures پہلے دو کو add کر کے تیسرے میں ڈال دیا جائے آپ کو یاد ہوگا call by value or call by reference اگر ہم اس طرح سے call by value کر لیتے تو تیسرے میں function کے اندر value ڈال جاتی واپس آتے تاک وہ value ڈائب ہو جاتی ہمیں آپ reference بھی دینا پڑتا Address دیتے see 3 کا complex number 3 کا and so on complexity grows what do we want to do with it اور دیکھیں میں نے complex numbers کا example وہاں سے کیوں شروع کی something as basic as a quadratic equation ax squared plus bx plus c equal to 0 where a b and c are real constants مجھے سلوشنز کیا ہیں again basic math سے آپ کو یاد ہوگا کیجی it is minus b plus and minus square root of b squared minus 4ac over 2a سیمپل چیزیں ہی یاد رہے جاتی ہمیں زندگی میں میں آج نہیں رٹا لگایا لیکن دیکھیں ہم square root لے رہے ہیں of b squared minus 4ac جب square root لی تو کیا ہمیں guaranteed ہے کیجی b squared minus 4ac will be 2 or greater than 0 آنسر is there is no guarantee آپ کے پاس کوئی بھی quadratic equation کا problemا آسکتا ہے جب یہ discriminant یہ negative ہو جائے تو اس کی square root کیسے لیں گے ہمارے پاس ایک سیمپل سی ٹیکنیکٹی ہم کہتے تھی negative number کی square root ہمیں لی نہیں آتی تو ہم کہتے ہیں minus one کی square root وہ آیوٹا ہوگی آی لکھیں گے اس کو engineers جی لکھتے ہیں اور پھر اس کی squares Matt education اور you need the roots of quadratic dost really part and an imaginary and that많 .. تو تھی سمپل جی monastery because화 ڈو بات سکتا ہے ہے جہی اور ہم کو ایک کامیونیٹ بہت سے دیتا سٹرکچر کو حکم کرنا کیا؟ کیا سی پلس پلس میں کامپلیکس دیتا طاپ ہے؟ ایک نام ہے کہ سی پلس پلس لن ہے کامپلیکس دیتا طاپ ہے یہ کامپلیکسی ہے، کسی برائیرے میں سکتے ہیں لیکن وہ بہت نہیں ہے یہ سب جانا ہوں کہ سی پلس پلس میں کامپلیکس دیتا طاپ بھی آگئی میانا ہوں کہتا ہوں کہ ہم کامپلیکس دیتا ہے کہ سی پلس پلس دین کے بارے میں دیتا ہے اس سے کامپلیکس دیتا ہے ایک ناہ میں اس بارے میں کہا ہوں کہ اسی طرح جائے اور بہت آپ کو کامپلیکس د Jae کی ناہ میں کہا ہوں کہ سیارت کی بارے میں اندر موجود سمجھ بھی سی پلاک کی تھی دو ت کا کامپیکس پاہلیینے کو چلا کیا سکتے ہیں ، سی ایک اور چیک اور لیکن وہ دیکلیا کے لئے ، سی و کو کامپیکس پاہلی پاہلی کے لئے چیک ، مک'tاا c1 اور چیک دوڑنری مک'tا ، اور ہمیں کامپیکس پاہلیینے کو اللہ سکتے ہیں۔ کیا اندرس کیا؟ اگر آپ تو بہت سو کامپیکس پاہلی کے لئے وبی جو مکشی کسی کسم کے دیتا کو بھی خصور کتی ہے؟ again enlarge your horizon آپ کتھان'tا جو بناکا انا video clipoon and video clipoon2 اپنے موپرائتر میں چاہتا ہوں کہ اتنہوں کو جوڑکے ایک لمبی video clip پنگیا ہے and I would want to write in my program video one plus video two again is the plus operator so intelligent the answer is noprises ۔ ۔ ۔ ۔ ۔ phi nhnb hajadit meso Bite ۔ ۔ کیقاہد about the ۔ ۔ ۔فس ، ہس침 کے کرا۔ ۔ ۔ Фاламت اس و خانی دوسرے اور ، اسے ح 번 گھر بے سکتے ہیں diffusionھی pants ۔ ۔ نار اپنا کسکتے ہیں arrange the تب Season بترادتی حاجت ۔ راجگ ۔ ۔ ۔ ۔نار ۔ ۔ ۔. اب میں آپ کی جو کامانے کی طرح ہی لئےzähام کیا جاتا ہے کہ اپنے عمول اٹنا جاتا ہےی ہے۔ ان کو کامانے کیا ہے؟ ان کو کامانےگی کیا ہے؟ ان کو کامانےگی کیا ہے؟ اور سوارنگ کیا ہے؟ اسٹنڈ دلرا صفیح کمانےگی کیا ہے؟ بہت ہوں ، اب ہم نے آپ کو ٹھوم事ہ کی ساتھی کھالے ۔ اب ہم بات کیا کریں گے، اپریٹر کی ساتھ بھی آپ کو کیا کرنےگے؟ کیا جادو کیسے کتا تھا قرار کرتا ہے شایوٹ جانبی ہم دیکھیں گے بہت ساری اللوڈنگ ہوتی ہے میکن ہے بوڑنی پر جو چلے لوگہ کولی�م کیا بسابقیوں پہلے چاہتے ہیں