 اسلام علیکم today is lecture number 39 of CS201 introduction to programming آج کا ہمارا topic ہے copy constructors or rather to be more precise I want to talk about classes جن کے اندر ہم dynamic memory allocation کرتے ہیں اور پھر ان class کے لئے کیا لواز مات ہیں جن کا ہمیں خیال رکھنا پڑتا ہے however before we get into this I think there is a topic that we need to review پوائنٹرز کا reference کا اور memory allocation کا ان کے بارے میں ہم بات کرتے ہیں لیکن میں نے دیکھا ہے کہ جی آپ کے بہت سارے سوالات ہیں ان topic کے اوپر لیکن let's take a brief review of this area what are pointers I think we've talked enough about them a pointer is a special type of variable that contains a memory address so it is not a variable that contains a value it is the address of memory that is contained inside a pointer variable variables can be now we are talking about c++ so variables can be without type so we can have a void pointer or they can be typed we can have a pointer to an integer a pointer to a character a pointer to a float or now that we have our user defined data types جن کا ہم classes کہتے ہیں we can have pointers to objects ساتھ اس کے related topic جو ہے وہ ہے references کا references بھی ایک special قسم کا pointer ہی ہے سمجھ لیں کہ جی اس میں بھی memory address ہوتا ہے لیکن pointer or reference کے اندر کچھ فرق ہیں pointers may point to nothing a reference always has to point to something a reference is like an alias for an object or a variable when I say an alias which means ایک ہی چیز کے اگر دو نام ہم استعمال کرنے چاہیں تو پھر ہم reference استعمال کرتے ہیں لیکن I also mentioned that's a bad idea it only makes the code confusing so let's leave references for the moment I'll come back and talk about them in a while when we're talking about pointers we're talking about pointing to an area in memory جتنی دیرتاکتا ہم بات کر رہے ہیں simple variables کی تو ایک pointer to an integer points to a location of an integer in memory لیکن ہوسکتا ہے کہ ہم وہاں پہ ایک array رکھنا چاہیں بہت سارے integers رکھنا چاہیں تو we can still use a pointer to point to the beginning of the array یہ تو simple manipulation ہو گئی اور پھر ہر memory location یعنی اگر کوئی variable ہے اس کا address ہم لینا چاہیں تو ہم ampersand operator استعمال کرتے ہیں یہی ampersand operator کا ایک اور مطلب بھی ہے وہ references کیلیے ہے so we have to be careful where we are using it so you should review that topic references کا استعمال زیادہ تر میں تو رکھمینجے کروں گا کہ آپ call by reference کو implement کرنے کیلیے کریں پھر ہمارا syntax جوہا بڑا آسان ہو جاتا ہے وہ stars جو ہیں جو pointers کیلیے استعمال کرتے ہیں ان کو ہمیں استعمال کرنے کی ضرورت نہیں رہتی لیکن we can implement a call by reference اس کے اوپر بھی آپ نے questions پوچھیں ہیں کہ جی call by value کیا ہوتی ہے call by reference کیا ہوتی ہے very briefly let me recap جب بھی ہم function call کرتے ہیں تو c اور c++ کا rule یہ کہتا ہے کہ by default اگر کوئی argument کوئی object کوئی variable آپ function کو pass کرتے ہیں تو وہ call by value ہوتا ہے which means original اپنی جگہ پہ موجود ہے اس کی ایک temporary copy بنالی جاتی ہے اور وہ function کو pass کر دی جاتی ہے function اس کوپی کے ساتھ جو مرزی کرے original value intact رہتی ہے that is a call by value however if we want the function to change something in the original object variable or whatever then we have to pass that variable or object by reference to do that we don't make a temporary copy of that object or variable we actually send the address of the variable اب جب function اس کو manipulate کرے گا and that original object manipulate ہو جائے گا اس کی values تبدیل ہو جائیں گی ایک اورت وجہ ہے جہاں پہ ہم call by reference استعمال کرتے ہیں that is for the sake of efficiency اگر ہمارے پاس کوئی بہت بڑا object ہے تو اس کو by copy بھیجنا is inefficient وہ stack کے اوپر بہت ساری جگہ اوکپائے کرے گا temporary copy بنیں گی اور وہ temporary ہی ہے لہذا اس وقت بھی ہم چاہیں تو call by reference استعمال کر لیں لیکن اس میں ہمیں خیال یہ رکھنا پڑتا ہے کہ جی یہ call by reference اس طرح کا جب ہم کریں تو وہ original object کو چیج نہ کرے اس کے لیے ہمارے پاس const keyword تھا جو کہتا ہے کہ جی ہم ایک constant reference پاس کر رہے ہیں اس کو استعمال ضرور کر لیں لیکن اس کی values کو تبدیل آپ نہیں کر سکتے and that applies to that function now having just covered these brief points ساتھ ہم آتے ہیں dynamic memory allocation کے اوپر see کے اندر ایک طریقہ تھا dynamic memory allocate کرنے کا یہ concept جو ہے کہ جی program چلتے وقت determine کرے کہ جی مجھے کتی memory چاہئے یہاں سے اٹھائی جائے allocate کی جائے استعمال کی جائے جب نہیں چاہئے واپس free store پے دال دی جائے یہ اتنا common function ہے اتنی زیادہ دفعہ استعمال کرتے ہیں ہم programming کے اندر کہ see plus plus لکھتے وقت سوچا گیا کہ اس کو function call کے ساتھ implement نہ کیا جائے بلکہ کوئی native operator بنا دیے جائیں جو کہ بہت ہی efficient ہوں وہ operators ہیں new or delete یہ key words کے بارے میں ہم بات کر چکے ہیں new کے ساتھ ہم free store سے memory allocate کرتے ہیں and it returns a pointer سو نمالی ایک pointer left-hand side پی آتا ہے assignment statement کے پھر equal to آتا ہے پھر new keyword آتا ہے اور پھر آگے جو بھی چیز ہم allocate کرنا چاہیں simple example پی is a pointer to an integer so our statement is int star p نیچے ہم کہتے ہیں p is equal to new int what this statement does is ایک integer کیلئے free store سے memory حاصل کرتا ہے ایک integer کیلئے اس integer space اس کا اپنا کوئی variable name نہیں ہے لیکن اس کا address پی میں store کر دیا چاہتا ہے now by using the syntax star p which means whatever p points to ہم اس integer value کو manipulate کر سکتے ہیں اس میں لکھ سکتے ہیں اس کو پر سکتے ہیں لیکن یہ ہے dynamic memory allocation یہ جب program چلتا ہے اس وقت یہ memory allocate ہوتی ہے جب بھی آپ new سے memory allocate کریں گے تو آپ کی اپنی responsibility ہے جب program ختم ہو تو یہ memory deallocate کی جائے اس کے لیے ہمارے پاس delete operator ہے جیسے ہم نے p equal to new int کہا تو اس کا جب program ختم ہوگا وہاں پہ ہم delete p کہیں گے p delete نہیں ہوگا جو memory p نے حاصل کی ہوئی تھی جس کو وہ point کر رہا تھا وہ memory واپس freestore پرکتی جاتی ہے لیکن آپ کو these concepts کیلئے same thing applies when we trying to allocate more than a simple variable when we trying to allocate arrays when we try to use new to allocate is for an array we use a very similar syntax accept array کیلئے وہاں square brackets and size بتا دیتے ہیں so now we can use something like p is equal to new int square brackets can do 10 it says p is now pointing to an area of memory which has room to store 10 different integers so it's an array of 10 integers and p will be pointing to the beginning point اس کے بعد آپ اس کو access کرلے by incrementing p or assigning it or using it like an array اس کو memory کو free کرنے کے لیے اس کا syntax زرا سا different ہے وہ بھی میں review کرتا چلوں جب بھی آپ نے array allocate کی ہے تو اس کو free کرنے کے لیے you have to say delete square brackets p that will then delete an array that p points to internally compiler نے یا c++ نے یہ record رکھا ہوتا ہے چلتے وقت یہ جناب کتنی memory allocate ہوئی تھی جتنی array کہ آپ نے in this case 10 integers کے لیے memory رکھی تھی تو delete empty square brackets p will de allocate a memory equal to those 10 integers which p points to delete کے بعد the pointer points to nothing so it is now a free pointer آپ اس کو reuse کرنا چاہیں تو کر سکتے ہیں now let's go on and look at a special type of object ایک کلاسز یا ان کے objects یہ وہ ہیں جن کے اندر data members وہ بزاتے خود pointers ہیں I am continuing that concept کہ یہ pointers کیا ہونگے لیکن دو تین میں example دیتا چلو ہم بار بار بات کرتے ہیں آپ نے examples بناتے رہے ہیں کلاسز کی ایک ہم نے بات کی class matrix اور matrix کے اندر میں نے کہا کہ یہ 2 dimensional matrix ہوگی اور اس کا یہ size ہوگا لیکن the concept کہ ہم ایک طرف یہ جنریک data type بنانے چاہ رہے ہیں اور دوسی طرف ہم کہتے ہیں کہ یہ matrix ہوگی اور یہ 3 by 3 matrix ہوگی تو یہ مزا نہیں آتا ہم چاہتے ہیں کہ جی matrix کی class تو دیفائن ہو جائے لیکن اس class کے ذریعے سے ہم object بیشک 3 by 3 matrix کا کریں بیشک 10 by 10 کا کریں بیشک 5 by 5 یہ نہیں we want the size of the matrix to be variable now you have to bring everything together and think in terms of how do we declare and manipulate arrays inside a c++ program جب بھی ہم array declare کرنے جاتے ہیں تو اس کے ساتھ ہمیں اس کا size بتانا پڑتا ہے it is necessary otherwise memory allocate نہیں ہو پاتی لیکن that is static allocation جو کہ program کے اندر ہم نے لکھ دیا کہ یہ ایک array ہوگی 2 dimension ہوگی اس کی m rows ہوگی اور n columns ہوگی جو real numbers ہیں they are not variables اور compiler ہی ہمیں اس کے لیے allocate کر لیتا ہے جو run time پے available ہوگی اب ہم بات کر رہے ہیں کہ جی compile time پے ہمیں نہیں پتا کہ array کا size کیا ہوگا ہم چاہتے ہیں کہ run time پے اتنی بڑی array allocate ہو جائے اس کے لیے now we talking back to a class again ہم چاہیں گے کہ class کا جب constructor call ہو اس وقت اس object کے لیے جتنی memory اس کو چاہیے وہ allocate ہو جائے تو اگر ہم class matrix ہی لے لیں تو ہم چاہیں گے کہ اس کے constructor میں ہم rows and columns بتا دیں کہ کتنے rows کی اور کتنے columns کی ہمیں ایک object چاہیے ایک matrix چاہیے اور پھر اس کا constructor کیا کرے کہ اتنی memory allocate کر کہ ہمیں واپس دے دے how do we allocate memory well I've just spoken about it this is where the new keyword comes in لیکن you also realize کہ as a data member of this class matrix we cannot use fixed rows and columns in the class definition we can't define a two-dimensional array inside the class and say کہ جی یہاں سے اب ہم کام شروع کر دیں because it negates the whole concept of extensibility so what do we do we say کہ جی inside the class we use something like int star m we say m is a pointer to an integer let's keep it simple ہم matrix integers کی ہی ڈیفائن کر رہے ہیں ہم کہتے ہیں int star m یہ اس کا data member ہو گیا لیکن اس کے constructor کی اندر ہم ڈیفائن کرتے ہیں کہ اس کے constructor جو ہے دو argument لے گا rows and columns both are integers جب آپ constructor میں جائیں گے اور یاد رہے کہ جب بھی ہم ایک object declare کرتے ہیں which is an instantiation of the class اس کا constructor call ہو جاتا ہے پہلی جب ہم اور this constructor ہمید want to do is we want to allocate memory from the free store equal to the memory that is required by rows multiplied by column integers گا 3,3 آپ کہتے ہیں تو نوہ integers کی لیے memory چاہیے اگر آپ کہتے ہیں 5 rows are 4 columns تو ہمیں 20 integers کی لیے memory چاہیے now it is very simple inside the constructor we will say نیو انٹ سکویر بریکٹز کے اندر روز، سٹار، کولمز دیکھیں کتنام مزایا ہم نے ایک میٹرکس کریٹ کی جس کو پرگرام کریٹ چلتے وقت ہم نے کسی ویریبرل کے طرو بتایا کہ جی اتنی روز اور اتنی کولمز کی مجھے میٹرکس چاہیے جیسے ہی ہم نے وہ ایک آبیٹ کریٹ کیا اس کا کنسٹرٹر کال ہوا جس میں ویریبرلز کی ویلیوز گئی ہیں ویریبرلز کی ویلیوز کو ملتیپلائے کر کے ہم نے کہا جی اتنے انٹیجرز چاہیے نیو کے ساتھ ہم نے میمری اتنی حاصل کی ام کو ایسائن کر دیا اس میمری کا ایڑرس آبیٹ انیشلائز ہو گیا اور اس کے اوپر اس کے پاس میمری بھی اویلیبل ہے now we can use it as a two-dimensional array and put any values we want inside it there is a requirement یہ requirement میں پہلے بھی بات کر چکا ہوں آج پھر recap کرتے چلتے ہیں requirement یہ ہے کہ اگر کنسٹرٹر میمری الوکیٹ کرے گا تو اس کلاس کے لیے دسٹرٹر لکھنا لازمی ہے you have to provide a destructor for that class so that when that object ceases to exist that memory that was allocated by the constructor is returned to the free store it is critically important otherwise کیا ہوگا ہوگا یہ کہ آپ کا object create کیا گیا اس نے free store سے میمری حاصل کر دیں object destroy ہوا اور ہم نے destructor نہیں لکھا ہوا اس کا so default destructor call ہو گیا اسی matrix کلاس کو لے لیں default destructor جو ہے جو m pointer تھا وہ pointer والی میمری ریلیز کر دے گا اتنی سی میمری جس میں pointer جو ہے its a variable جو ڈرس رکھتا وہ pointer جایا ہو جائے گا لیکن وہ pointer نے جو memory allocate کی ہوئی تھی وہ تو free ہم نے کی ہی نہیں ہے now that is an unreferenced block of memory which cannot be used not by your program not by any other program it's a memory leak something to avoid so whenever we have a class جس میں constructor کی اندر ہم dynamic memory allocation کرتے ہیں اس کلاس کے لیے destructor Provide کرنا لازمی ہے and that destructor must free the memory freeing is easy ابھی میں نے آپ کو example دیا تھا کہ جی delete ہم operator call کرتے ہیں اور پھر ہمیں ضرورت نہیں ہے یاد کرنے کی کہ rows columns کتنے تھے you just say delete empty square brackets am so it'll say کہ am نے جتنی memory allocate کی تھی وہ ساری free کر دو so it's quite simple but we must write that destructor what other problems arise whenever we have objects of a class جہاں پہ دینیمیک لیی memory allocate ہوں let us look at the concept of assignment assignment اور initialization کو پہلے ہم تھوڑا سا دسکس کر لیں دیکھیں initialize ہم کرتے ہیں انٹ آئی equal to zero semi colon یہ ہے declareing an integer and initializing it دوسرا طریقہ ہے انٹ آئی semi colon آئی equal to zero semi colon effect اس کا یہی ہے but the behavior is different پہلے آئے کے لیے جگہ allocate ہوتی ہے اور پھر اس کو ایک value assign ہوتی ہے so I'm now being careful I'm no longer calling it initialization I'm calling it assignment same applies whenever we whenever we create objects you can either create an object and initialize it at the creation time which is which means کہ جی constructor call ہو رہا ہے or you can create an object and then assign values to its data members later which is usually done by using either set functions or doing assignment statements nonetheless یہاں پہ میں ڈیفرنشیٹ یہ کرنا چاہ رہا ہوں کہ اگر ہمارے پاس دو objects ہیں کسی کلاس کے let's stay with matrix for the moment so I have matrix m1 m2 m1 میں نے create کرلی کسی طریقے سے اس کے rows column allocate ہو گئے اس میں values دال دی گئیں اب اگر میں کہیں program میں جاکے کہوں m2 equals m1 it is an assignment statement اور اس کو ہم نے تھویہ سا دسکس کیا تھا کہ یہ assignment کرنی کیسے ہے اگر آپ اپنا overloaded assignment operator نہیں بتاتے تو see plus plus you have a default assignment کر دے گا اور default assignment کیا ہوتی ہے it is a member to member assignment now let's again look at the construct matrix class کی لیہ ہم نے data member رکھا کیا ہے ہم نے ایک چیز رکھی ہوئی ہے a pointer to an integer so instar m ہم نے لکھا ہے class definition کے اندر so m1 کے اندر there is a pointer to an integer but m1 is a fully qualified developed object it is let's say a 5 by 5 matrix اور اس میں نمبرز دلے ہوئے ہیں نیچے جاکے میں کہتا ہوں m2 equal to m1 m2 کا اپنا instar m بھی ہے it also has a pointer to an integer as its own data member اگر ہم کوئی assignment operator نہیں لکھتے اس class کے لیے تو m1 کا جو پونٹر تھا ایم وہ m2 کے ایم کے اندر اس کی value لکھی جائے گی now you have two objects جن کے اندر pointer variables ہیں they both hold the same address لہذا they are pointing to the same region in memory کوئی problem بہت سارے problems پہلی چیز کہ جی m1 آپ نے دستروی کر دیا so m1 جب دستروی ہوا تو ابھی میں نے بتا ہے کہ جا ایسے جو objects ہیں یا ایسی class ہیں ان کے لیے destructor لکھنا لازمی ہے وہ destructor m1 object کے لیے call ہوا اور اس نے اس کی جو memory allocate کی تھی اس کو فارق کر دیا so memory is now free it has gone back to free store تو اس بچارے m2 کے ساتھ کیا ہوا m2 کے اندر ایک pointer بیٹھا ہوئے which is pointing to that same memory but the memory is no longer allocated it is back to the free store اس میں کوئی گاربے جا چکی ہے کسی اور program نے استعمال کر لی ہے so we have a serious problem we don't want two objects to point to the same region in memory لہذا ہم assignment operator لکھتے ہیں اور وہ کچھ اس طرح سے لکھتے ہیں کہ جب بھی آپ نے assignment کرنی ہے اپنے لیے علیادہ جگے allocate کرو اور پھر اس جگے کے اندر دوسرے object کی values copy کرو اور پھر یہ ایک independent object بن جاتا ہے so you have to be careful whenever we have a class جس کے اندر ہم dynamic memory allocation کرتے ہیں اس کے لیے ہمیں assignment operator بھی لکھ لینا چاہیے the other part is what we call the copy constructor which is the main topic for today copy constructor کی کب ہم ضرورت پیش آتی ہے well ابھی میں نے آپ کو assignment کے example دیا اور بتایا کہ اس کے اندر danger کیا ہے the same danger applies اگر اس کسم کا objects let's say matrix class ہم کسی function کو پاس کر دیں اور چاہے کہ وہ function کوئی کام کرے اس کے اوپر suppose we have a function which takes an object of a class matrix as an argument default rule کیا ہے c or c plus plus کا it says call by value so what is the value for this object that is going to be passed to the function by اس کے جو ڈیٹا میمبرز ہیں ان کی value جائے گی function میں جائیں گے ایک temporary object اس کو ملے گا temporary object it's call by value original object کو کچھ نہیں ہم کر رہے لیکن اس temporary object کے دیٹا میمبرز کی values کیا ہوں گی وہ values وہ ہی ہوں گی جو کہ original میمبر کی تھی اب اگر یہ simple class ہے تو کوئی problem نہیں لیکن جہاں پہ کلاس آگئی matrix طرح کی جہاں پہ ایک pointer میمبر بیٹھا ہوا تھا اور pointer میمبر نے اپنے لیے کوئی جو میمری ہے وہ allocate کی ہوئی تھی اب جب آپ function میں جاتے ہیں اس وقت اس کے pointer کی value copy ہوکے as a value pass ہو جاتی ہے memory pass نہیں ہوتی اب آپ function میں گئے you have a temporary object but the temporary object has a pointer میمبر which is pointing to the same memory location as the original object اگر تو آپ صرف پڑھ رہے ہیں اس وقت کو صرف display کر رہے ہیں اس وقت کا کوئی problem نہیں لیکن اگر آپ اس وقت کی values بدلیں temporary object pass by value into this function you can only change those values by using the pointer میمبر of the class pointer کو جیسے ہی آپ نے ہاتھ لگایا original object کی values بدل گئی a huge side effect اور وہ ہمارے انجانے میں ہوا ہم نے تو call by value کی ہے call by reference کی ہی نہیں ہے ہمیں پتا ہے کہ یہ temporary object create کر کے function کو pass ہوا ہے so how can we get around this problem the way to get around this problem is to create a complete copy of the object so we want کہ نہ صرف object کی copy بنے جس نے اس کا pointer کی ایک copy بن جائے لیکن pointer جو ہے it must not point to the same memory location it must point to its own memory location so we want to have a copy constructor ایک constructor جو کہ ایک نیا object create کرے with a full copy of the other object اس کو ہم deep copy بھی کہتے ہیں as opposed to a shallow copy shallow copy جیسے shallow پانی ہوتا ہے کہ جی گہرا نہیں ہوتا وہ کیا کرتی ہے وہ member to member اس کی value کی copy کر لیتی ہے and it doesn't care کہ جی member pointer ہے کہ ordinary variable ہے ordinary variables کا کوئی مسئلہ نہیں ہے ان کی copy بنائیں is perfectly valid and legal but if we make a member copy of a pointer we run into this problem کہ pointer کی value وہی رہا جاتی ہے نیا pointer variable create ہوتا ہے you don't create or allocate new memory for that so we have to write something special which is called a copy constructor کوپی کنسٹر کا ایک اسم کیا آپ you have to imagine کی اس کا syntax ہوگا کیا the basic line is you trying to create a new object by passing an object of the same class as the argument so you should think of a constructor یہ ہی اگر ہماری class matrix ہے تو اس کا prototype جو ہوگا it will be matrix دیکھیں کنسٹر ہے تو کنسٹر کا نام وہی ہوتا ہے جو کنسٹر کا نام ہوتا ہے so the name of this constructor will be matrix now we saying اس کو ایک argument pass ہوگا and an argument will be an object of the same class and normally that is a reference to an object of the same class so the prototype of the copy constructor is matrix and then within parenthesis matrix and the ampersand says اس کو ایک reference pass ہوگا of an object of type matrix اس کے بعد باری آ جاتی ہے کہ جیس کو لکھنا کیسے ہے جب بھی ہم ایک copy constructor لکھنے جاتے ہیں تو we have to be careful we have to allocate new memory for that copy so when we go into this copy constructor پہلے ہم دیکھتے ہیں کہ جو original object جس کا reference pass ہوگا ہے اس نے کتنی memory allocate کی ہوئی ہے since we have passed the object we can get all the queries for example matrix کے لیے row column کتنے ہیں اس کے لیے نئی memory ہم allocate کرتے ہیں so a temporary object ہم create کرتے ہیں inside the constructor memory allocate کی پھر اس کی memory جو allocated ہے اس میں اس کی values copy کی جو object by reference pass ہوگا ہے اس کی values اٹھائیں اور نئی memory کے اندر values copy کی جو اس کا pointer ہے int pointer تھا to memory وہ اب اس نئی جگے کو point کرے گا اور یہ constructor کمپیٹ ہو گیا constructor آپ کو یاد رہے return کچھ نہیں کرتا so there is no return statement it just creates a new object in this case we are creating a new object جو کہ memory actually allocate کرتا ہے اور پھر صرف shallow copy نہیں کرتا so there is no copy of the pointer value in fact the pointer has a new value but the values being pointed to which means جو memory allocate کی تھی اس میں جو number لکھے ہوئے تھے ان کی copy بنائی جاتی ہے into this new allocated memory and then this fully constructed object is returned now we have this facility جب ہم نے copy constructor لکھ لیا so now we can define new objects based on existing objects especially objects جہاں پر dynamic memory allocation ہوتی ہے and we can use this copy constructor without causing any problems how do we do that آپ کے پاس اوپر لکھا ہے matrix a parenthesis 3 comma 3 what will happen ہم نے ایک constructor define کیا ہے جو لیتا ہے row comma columns as the matrix initializer ہم نے اتنے روز اور اتنے columns کی memory allocate کی ایک object کر لیا نیچے چلتے چلتے ہم کہتے ہیں matrix b اور parenthesis میں لکھتے تھے a اوپر جو matrix a بنی تھی اس کی پوری copy بن جاتی ہے and a new matrix object b is created لیکن b کا اپنا pointer ہے اپنی memory allocation ہے it is different from the memory allocated inside the matrix a now a can ڈائی you can ڈائی اس کو destroy کر دو function میں create ہی تھی function سے واپس ہوا a ڈائی بی is now still a valid matrix object so a copy constructor is critically useful it is useful when we want to create a duplicate copy of an object and it is always used whenever we want to do a call by value into a function اور اس function کو ہم کوئی object پاس کر رہے ہیں اور object جو ہے وہ اس کلاس کا ہے جس میں ہم نے dynamic memory allocation کی کر رکھی ہے let us take a look at an example to get these concepts down example ہم ایک چھوٹی سی کلاس لکھ لیتے ہیں let's call it a string class جس کا ایک member ہے which is a pointer to a character اور ایک کوئی ہم اس کو a member function دے دی دیتے ہیں a copy function جوکہ اس کارکٹر ڈائی کے اندر values copy کر سکے دیکھے میں نے pointer to a character کیا کے ساتھ یہ کارکٹر ڈائی کیا دی so you know what's coming constructor ہوگا وہ ایک ڈائی ایک character ڈائی which is a string اس کے لیے جگہ allocate کرے گا اور اس کا starting address اس کے data member میں ڈال دے گا اب اس کو آپ یہ کریں کہ اس کے دو objects بنائیں for the moment keep it very simple دو objects بنائیں اس one اور اس two لیکن اس one آپ بنائیں اور آپ نے کوئی copy constructor نہیں لکھنا صرف ایک constructor لکھنا ہے جوکہ assign کر سکے اس کے اندر values یا copy ہم نے بنالیا ایک function اس کے لیے اس one میں آپ اس کو object create کریں اور اس کو کوئی string assign کر دیں نیچے جا کے آپ کہیں string s2 equal to s1 so آپ نے ایک نیا string object create کیا جس کے اندر اس کی values s1 سے لیے لیے اس کو initialize کر دیا with the values of s1 یاد رہے ہم نے کوئی copy constructor نہیں لکھا ہوا لہذا c++ will provide a default copy constructor اب اگر آپ s2 کی string کو پرنٹ کریں گے تو you will find کہ یہ وہی ہے جو اس one کی string ہے ابھی تک surface ہے ہر چیز ٹیک لگ رہی ہے کہ یہ آپ نے اس two بنائے ہیں اور اس کو کیا equal to s1 so they must be the same now comes the fun part use the copy function to assign a new value to the string inside the inside the object s1 so we say s1.copy اور کوئی نئی string دے دیتے ہیں اس کے بعد آپ کریں now you will see the surprise کہ s2.print وہی value پرنٹ کرتا ہے جو ابھی ابھی آپ نے اس one کو assign کی تھی وجہ اس کی simple ہے اس میں default copy constructor جو call ہوا تھا اس نے member to member copy کی ہے اس نے جو character pointer تھا اس کی value جو ہے s2 کی اندر ڈال دی so the pointers are now pointing to the same memory location now we need to provide a copy constructor even for a class like this and we have to provide a destructor because we are doing dynamic memory allocation inside the constructor of the class what else is affected the other part that's affected is the assignment operator itself اب دیکھیں ہم نے پہلے بھی بات کی تھی کہ جی assignment operator of something like جس کلاس کے اندر dynamic memory allocation ہوری ہو اس کے اندر بھی کچھ dangers ہیں آنکے بند کر کے ہم ایک assignment operator نہیں لکھ سکتے اسی کلاس کا that operator must first look at the fact کہ جی آپ self assignment تو نہیں کر رہے I'll recap that topic for a woman suppose you have an integer I so you say int I آپ کہتے ہیں I is equal to 10 اور نیچے جا کے آپ کہتے ہیں I is equal to I کوئی مسئلہ نہیں ہوتا this is a legal statement لیکن more complicated اگر آپ پوانٹر کے through اس کو ایسان کریں اور پوانٹر اس اپنے آپ کو ہی point کر رہے تب بھی کوئی مسئلہ نہیں ہوگا لیکن جیسے ہی ہم object میں گئے اور اس object میں dynamic memory allocation کی ہوئی ہے تو اب assignment کا طریقہ بدل جاتا ہے matrix کو لیلیں آپ کے پاس ایک matrix کا object ہے اس میں 3 rows اور 3 columns تھے دوسرہ object matrix کا اس میں 5 rows اور 5 columns تھے let's call the first one 3 by 3 matrix کو ہم نام دے دیتے ہیں m1 5 by 5 کو نام دے دیتے ہیں m2 program میں چلتے چلتے ہم کہتے ہیں m1 equals m2 m2 بڑا object ہے m1 چھوٹا object ہے ہم چاہتے ہیں کہ بڑا object چھوٹے object کے اندر assign ہو جائے will it fit the answer is it won't fit so what must the assignment operator do the assignment operator for objects of this type of class پہلے جاکے memory کو de allocate کرے گا left hand side object نے جو memory reserve کی ہوئی تھی اس کو delete کے ساتھ free کر دے گا اس کے بعد وہ right hand side والے object کو دیکھے گا کہ اس کو کتنی memory چاہیے اس کے بعد وہ new operators کے ذریعے اتنی memory free store سے حاصل کرے گا جب وہ مل جاتی ہے پھر وہ values copy کرے گا اور m1 equals m2 جیسی simple statement تب جاکے effective ہو گی so assignment has a requirement اب جہاں سے ہم نے بات چلو کی تھی کہ جی i equal to i کہدن تو problem کوئی نہیں آتا لیکن اگر میں m1 equal to m1 کہدن تو کیا ہوگا ہم نے ابھی assignment operator کو define کیا کہ جیسے سب سے پہلے وہ m1 یعنی left hand side والا object ہے اس کی جو memory allocated تھی اس کو delete کرے گا اس نے delete کر دی اب وہ کہتا ہے کہ جیسے right hand side والا object ہے اس میں کتنی memory ہے by right hand side والا object تو وزاتے خود وہی تھا اس کی تو memory delete ہو چکی ہے you've got a problem so جب بھی ہم assignment operator لکھتے ہیں for objects of a class which has dynamic memory allocation the very first thing we do is check for self assignment یہ تو نہیں ہو رہا کہ دونوں طرف ایک ہی object پڑا ہے کیونکہ اس کی memory delete کر دی تو object زایا ہو جائے گا so assignment میں تو ہم self assignment پہلے چک کر دیں اور پھر جاکے باقی کام کرتے ہیں on the other hand ابھی میں نے جو آپ کو ایک سامپل دیا تھا کہ جی ہم matrix کا ایک object کرتے ہیں اور اس کو create کرتے ہیں using a copy constructor by giving it another object کے اس object کی copy بنا کے مجھے ایک نیا object create کر دو اس کا syntax ہم نے لکھا تھا matrix m2 parentheses m1 that was the syntax for creating a new object based on an existing object لیکن اس کو اس طرح سے بھی ہم لکھ سکتے ہیں matrix m2 equals m1 semicolon when we write it like this you should be very clear کہ یہ اسائنمنٹ نہیں ہو رہی یہ اسائنمنٹ نہیں ہو رہی یہ construction ہی ہو رہی ہے so whenever we using initialization then the assignment operator لگتا equal to ہے لیکن یہ actually assignment operator call نہیں ہوتا logically اس کو سوچیں کہ کیوں اسائنمنٹ اپریٹر call نہیں ہوتا اسائنمنٹ اپریٹر تو existing objects کیلئے call ہوتا ہے نا left side پہ کوئی matrix class کو object ہوگا تو وہ call کرے گا assignment operator کو جب ہم نے یہ declaration line لکھی ہوئی ہے matrix m2 equals m1 تو m2 تو ابھی construct ہوا ہی نہیں ابھی وہ matrix object exist ہی نہیں کرتا so it can't be calling the assignment function or assignment operator this is an example of the use of a copy constructor but there are two different ways that we can write it یہ یاد رکھنے کہ جب بھی آپ declaration line کی اندر آپ object create کرتے ہیں اور اس کو initialize کرتے ہیں تو وہ copy constructor کو call کرتا ہے یہ بھی وجہ ہے کہ جی copy constructor ایسی classes کیلئے لکھنا لازمی ہو جاتا ہے اگر آپ نہیں رکھیں گے تو وہی problem رہے گا دونوں میں pointer variable کی same value آجائے گی it'll point to the same region of memory let us recap this whole issue جب بھی آپ کے پاس کوئی ایسی class آتی ہے جس کے اندر آپ dynamic memory allocation کرتے ہیں اس کے لیے number one you must define a constructor otherwise you won't be able to do dynamic memory allocation constructor memory freestore سے حاصل کرے object کو properly initialize کرے اس کے pointer values کا address سیٹ کرے and a properly constructed object you have وہ return کرے number 2 اس کے لیے assignment operator ضرور لکھیں and the assignment operator must as a first thing check for self assignment کیا آپ اپنے آپ کو تو نہیں delete کر دیں گے assignment کرتے وقت اور پھر اس کے بعد وہ deep copy کرے اپنے لیے نئی جگہ allocate کرے اس جگہ کے اندر پرانے object کی values کو copy کرے and a properly constructed object جو ہے وہ return ہو تیسری چیز کیونکہ constructor میں ہم dynamic memory allocation کر رہے ہیں destructor Provide کرنا لازمی ہے اور destructor بزاتے خود جو ہے وہ اس allocated memory کو free کرے these 3 rules must be followed ان کو آپ اچھی طرح سٹڑی کر لیں اور اس کے لیے آپ اگر چھوٹے چھوٹے programs لکھ لیں and you can prove to yourself that they work prove کرنے کا طریقہ کیا ہے کہ جناب آپ اگر memory allocate کرتے ہیں constructor میں اور destructor میں اس کو delete نہیں کرتے تو usually آپ next time program کو جب second time run کریں گے تو وہ نئی memory allocate کر لے گا can we find out کہ کسی memory allocate کی ہے use see out to print the value of the pointer not what it points to but pointer کی اپنی value کیا ہے وہ آپ کو screen پر وہ 0 x کے ساتھ دکھائے گا یعنی it's a hexadecimal figure we don't care about the exact value but you will find کہ اگر آپ نے proper destructor Provide کیا ہوا ہے تو ایک ہی computer پے ایک ہی سیشن میں بیٹھے بے ایک دفعہ program چلایں گے تو اس کو خاص address allocate ہو جائے گا with a proper destructor you end the program you start it again 9 times out of 10 وہی memory آپ کو واپس ملے گی انی وہی address آپ کو نظر آئے گا why did I say 9 times out of 10 because it's possible کہ operating system کچھ میمری کو in the meantime کر لے between the two times that you run this program لیکن اگر آپ destructor Provide نہیں کریں گے یعنی اس میمری کو dialocate نہیں کریں گے تو لازمی ہے کہ next time you run the program اس کو وہ میمری نہیں ملے گی کوئی اور ملے گی so you can prove to yourself کہ جی نیا address آگیا اور every time نیا address آ رہا ہے اور وہ میمری زائیہ بھی ہوتی جا رہی ہے so please be care for provide a constructor provide an assignment operator and provide a destructor for this type of class دوسی چیز جو یاد رکھنے والی ہے کہ یہ استعمال کہاں پے ہو رہے ہیں کئی جگہوں پے explicitly استعمال کر رہے ہیں جہاں پے ہم نے as programmers لکھ دیا ہے matrix m2 parentheses m1 it's an explicit call to a copy constructor m1 is passed by reference ہم نہیں چاہتے کہ m1 کوئی چینج ہو تو ہم بیچ میں const کا کیورٹ بھی لگا دیتے ہیں it's just helpful for us کے جیے Constructor جو object pass ہو رہے ہیں اس کو کچھ نہیں کرے گا اس کے ایک copy بنائے گا یہ تو explicit usage ہے program پڑیں گے آپ کو نظر آ جائے گی کہ جہاں پہ copy constructor استعمال ہو رہا ہے جہاں پے نظر نہیں آئے گا لیکن ہو copy constructor ہی رہا ہے وہ ہے declaration of matrix m2 equal to m1 careful it is not an assignment operator it is a copy constructor تیسرہ calling function and passing an object by value اگر آپ نے copy constructor provide کیا ہے وہ automatically call ہوگا object کی copy پوری proper with dynamic memory allocation and all وہ temporary copy بن کے function کے اندر جائے گی اگر آپ copy constructor provide نہیں کریں گے call by value والے functions لازمان آپ کو problem دیں گے اس میں جاکے اگر آپ نے object کی کوئی value بدل دی تو original object کی b value بدل جائے گی اور آپ سوچ رہوں گے میں تو call by value کیا تھا the original object تو قائم ہے وہ قائم نہیں رہتا function calling کے اندر جب آپ call by value کرتے ہیں copy constructor is called on the other hand call by reference میں copy constructor call نہیں ہوتا original object کا address pass ہو جاتا ہے so یہ دو تین جگے ہیں جہاں پہ copy constructor استعمال ہوتا ہے and it is critical that you learn how to write them ok many complex things ایک اور danger کی بھی بات کر لیں یہ بات یہاں پہ آتی ہے کہ جی اگر copy constructor آپ provide نہیں کرتے میں اس چیز کو اس کے اس طرح بار بار سٹریس کرتا ہوں کہ جب بھی آپ ایسی کلاس لکھیں تو لازمان یہ چیزیں provide کریں suppose you do a call by value into a function ایک چیز تو ہم نے یہ بات کہی تھی نا کہ جی وہ اگر value بدل گا تو main program میں value بدل جائے گی but یہاں پہ ایک اور بھی subtle problem ہے call by value میں object کی ایک temporary copy بنی وہ copy چلی گئی function کے اندر جب function نے اس object کے copy کے ساتھ جو بھی کرنا تھا کیا function جب واپس آیا تو وہ temporary copy destroy ہو گئی because وہ تو local تھی function کے لیے now suppose a destructor exists for that class and the destructor actually goes and de allocates memory so here is a funny class جس میں آپ نے constructor تو copy constructor provide نہیں کیا ordinary constructor ہے جو کہ مطلب memory allocates کرتا ہے اور پہلے رول کے تحت اگر کوئی ایسی کلاس ہے جس کا constructor memory allocates کرے گا تو destructor ہونا چاہیے جو کہ memory de allocates کریں copy constructor کوئی نہیں ہے اس کا ہم نے function call کیا object کی copy بنی shallow copy صرف pointer کی values copy ہونے اور آپ چلے گئے function کی اندر so function now has a temporary object with the same data values as the original object function نے جو کام کرنا تھا کر لیا جب function exit کرنے لگا تو this temporary object is destroyed کچھ اس خیال آئی وہ temporary object will call its destructor if it calls its destructor اس نے memory de allocates کر دی کنسی memory de allocates کی جو کہ اس temporary object کا pointer جس چیز کو point کر رہا تھا وہ de allocates ہو گیا but that pointer تو وہی address رکھتا تھا جو original object کے اندر address تھا because this was a shallow copy وہ memory de allocates ہوگی تو یہ object جو ہے پکڑ کے pointer بیٹھا بہت ہوا it's pointing to nothing any what you've done is in the process of a function call you've destroyed the original object destroyed in the sense that it is an invalid object now it's pointing towards regions of memory that are unknown very subtle but very critical and this again is avoided by using a copy constructor which actually constructs a fully formed object with its own memory وہ temporary object جایگا function میں اس temporary object لیا destructor بھی call ہوگا اس کی memory بھی free ہوگی لیکن original object کو کچھ نہیں ہوگا this is subtle میں اس کو recap کر دوں پہلی چیز یہ تھی کہ اگر constructor کے اندر کوئی بھی dynamic memory allocations ہو تو اس کلاس کے لیے destructor provide کریں تاکہ memory زایا نہ ہو وہ memory free کر دے delete operator کے through number two was اسی کلاس کے لیے copy constructor بنانا لازمی ہو جاتا ہے otherwise functions will play havoc with your objects جو بھی call by value ہوگی وہ original object کو تبا کر تا رہے گا so constructor کے ساتھ تو destructor آگیا لیکن ساتھ ساتھ ایک copy constructor بھی provide کرنا لازمی ہے and I just told you کہ assignment operator بھی اسی کلاس کے لیے provide کرنا لازمی ہو جاتا ہے otherwise you will not have a proper class a complex topic but you will have to actually experiment with it get your hands dirty to understand these concepts but they are very very commonly used so we become familiar with them so what have we covered today we did a little recap کیجی pointer کیا ہوتا ہے it's a little variable that holds a memory address to get an address of a variable or an object we use the ampersand operator the and sign and sign is also used as a shorthand for a reference so whenever you have a declaration can the and sign it implies a reference whenever you have an and side on the right hand side of an assignment operator it is taking the address of an object using pointers we can do dynamic memory allocation in c++ we have two very efficient operators provided which are new and delete we use them for obtaining memory from the free store and it returns a pointer to the allocated memory وہ ہم pointer variable کیان درکتے ہیں یہ تو global level پے بات ہو گئی اس کے بات ہم چلے گئے کلاسے کے اندر جن کے اندر بزاتے خود دینامیک memory allocation ہو رہی ہے لہذا کلاس کا دیٹا ممبر ہے جوکہ پوانٹر ہے اور پوانٹر جو ہے وہ at runtime when we create objects of that class وہ ممری allocate کرے گا کتی ممری allocate کرے گا جتنی ہمے ضرورت ہے so there is no waste of memory you don't have a small area جس میں بڑی ساری values fit کرنے کی ہے you don't have a huge area جس کے اندر تھوڑی سی values رکھنے اور باقی memories آیا رہی گی so we do dynamic memory allocation inside these classes whenever we have dynamic memory allocation inside a class we have to provide a few things we must provide a constructor that does the memory allocation for us and produces a well formed object we must provide a copy constructor that is able to create fully formed copies of objects that means نہ صرف ان کے پوانٹر کی علیدہ علیدہ copies بنے وہ پوانٹر کے addresses بدل جائے اور اپنی اپنی ممری کا وہاں پہ allocations ہوئی ہو اور ممری کے اندر پھر values copy ہوئی ہو so copy constructor provide کریں گے assignment operator last me provide کریں گے تاکہ self assignment نہ ہو and you can assign one object to the other in a proper fashion again using the concept of deep copy not a shallow copy so you allocate memory space then you copy element by element into this allocated memory and you've produced an assignment and finally when we do a de allocation which means whenever we destroy an object whenever it goes out of scope جیادرہے functions کے اندر automatic variables بنتے ہیں so automatic objects بھی بنتے ہیں function ختم ہوتا ہے those objects are destroyed that is going out of scope or they are no longer existing we must provide a destructor or destructor کے اندر جو ممری allocate کی گئی تھی اس کو allocate مطلب de allocate کرنا یا delete کرنا لازمی ہے تاکہ ممری زایانہ ہو these topics which are concerned with ممری allocations and de allocations especially as they are concerned with objects and classes you should review very thoroughly and be کلیر that you understand them now we have essentially covered most of the major constructs of the language what I would want to do is lead you through a few comprehensive examples جس میں ہم نے جو programming ٹیکنیق سیکھی ہیں ان کو ہم exercise بھی کر سکیں we are giving you assignments constantly it is important that you do those assignments but please don't stop there doing an assignment is کجی کوس میں نمبر کتنے لینے ہے that is not the objective the objective my personal objective and generally the philosophy at the virtual university is that you have to gain knowledge knowledge comes if you also work hard so just assignment نہیں کرنی صرف midterms نہیں کرنے صرف finals نہیں دینے you also have to do a lot of practice on your own please make that part of your own life philosophy as well only then will you learn these skills see plus plus is not the only language that you will come across in your programming career there will be other languages what we want you to learn from this course is کجی programming کی کسے جاتی ہے programming کی constructs کیا ہیں اور کیوں کہ آج کل زمانہ ہے object oriented programming کا تو ہم نے objects کی introduction آپ کو ضرور دے دی ہے object oriented programming کی بات ابھی نہیں کی اس کے اندر polymorphism virtual functions inheritance یہ سارے اشوز آتے ہیں جاوہ کے اندر بھی یہ ساری چیزیں ہیں لیکن if you know the basics right you know there are sequences there are iterations or loops there are decisions تقریبا ہر programming language آپ کو یہ چیزیں پروائیڈ کرے گی syntax آپ اس لینگوچ کا علیہ دا سی سیک سکتے ہیں when we talk about objects and their creation and the constructors and destructors the concepts you should treat as generic کیجی ایک چیز کنسٹ کرنی ہے ایک چیز دیشٹرائک کرنی ہے اس کی ایک سکوپ ہے اس کی ایک life time ہے ہا syntax for the moment ہم see plus plus کا استعمال کر رہے ہیں and as i said earlier to acquire the skills and become familiar with this you have to do a lot of practice the book that we have prescribed contains numerous examples at the end of every chapter اپنے طور پہ جو آپ میں سے زیادہ وہ ایک سامپلس کریں گے وہ زیادہ سیکھیں گے they will be more comfortable with the concepts and they will of course not only get more marks but they will become more successful programmers سو چلتے چلتے یہ میں کہتا چلوں please practice a lot till next