 عuplalat into the information portfolio بیک slipping چپس میں بہت ہائے ہمیں بہت کورک لیا험د Owen کلاسیز کے اندر ہم ممبر فنکشنز کیسے دیفائن کرتے ہیں ان سے ایسا پھر objects کو منبلیٹ کیسے کیا جاتا ہے. We looked at a few fine points about copy constructors اور کلاسیز جن کے اندر dynamic memory allocation کی جاتی ہے. ان کی کیا لواز مات ہیں. Assignment operator کیوں دیفائن کرنا پڑتا ہے. And so on. اب ہم تھوڑے سے اور fine points کو دیسکس کریں گے جس میں کوئی زیادہ نئی چیزیں انٹروڈیوز نہیں ہوں گی. لیکن جو ہم پڑھ چکے ہیں اس کو ہم تھوڑا سا console ڈیٹ کریں گے. کچھ نئے ideas concept ڈیٹ کریں گے اور پھر towards the last 3 lectures I intend to take one comprehensive example and lead you through the entire process of design fragmentation or segmentation into the various smaller pieces which will be in this case objects and then the code that goes with them in terms of member functions. So آج کے لیے ہم جس چیز کی بات کرنا چاہتے ہیں وہ یہ ہے کہ جی ہمارے جو ہم classes create کرتے ہیں کیا ان کے اندر objects ہو سکتے ہیں یا نہیں. And if you think about it the answer in fact is self evident. دیکھیں کلاس کا ہم نے structure define کیا کلاس کیا چیز ہے its a user defined data type اور user defined data type کے ساتھ اس کے اندر کچھ اور additional features اس کے سم کہ ہیں کہ اس ڈیٹا کو manipulate کرنے کے لیے member functions اور باقی چیزیں جو ہم وہ کلاس کے اندر ہی موجود ہیں اور پھر public اور private جو ہمارے access specifiers ان کے ساتھ ہم نے اس طرح سے declare کرنا چاہتا ہاں کہ ہم کیا چیز کلاس کے بہت سے دکھانا چاہتے ہیں اور کیا چیز کلاس کے اندر ہی رکھنا چاہتے ہیں. ڈیٹہ hiding کا concept آگیا جس کے اندر ہمے سب سے زیادہ فائدہ یہ ہوا کہ variable names کی کچھ بندش کم ہو گئی کہ جی کلاس کے اندر جو private variable name استعمال کیا گیا ہے وہ باہر علیدہ سے استعمال ہو سکتا ہے without having any overlap or having any side effects. On the other hand ہم کلاس کا ایک public interface بھی دینا چاہتے ہیں جو چیزیں بہر سے نظر آئیں. So we could very easily separate the concept of the internal working of a class and what we want to show from the outside. اس کا بھی ہم نے فائدہ دسکس کیا. Let's just review that. The idea behind separation of implementation which means کلاس کے اندر کیا ہوتا ہے and the interface which means کلاس بہر سے کیسی نظر آتی ہے. اس کا ہمیں major advantage یہ تھا کہ جی implementation جو ہے وہ آپ جب چاہیں بدلنے. اگر آپ کو نیا ڈیہ آگیا ہے نئی programming construct آگئی ہے کوئی آپ کو طریقہ آپ کو خیال آگیا ہے جسے آپ کلاس کی working زیادہ efficient بنا سکتے ہیں efficient both in terms of speed جس پہ وہ چلتی ہے یا in terms of storage کم storage میں یہی کام ہو سکتا ہے آپ internal workings کو جب چاہیں بدل سکتے ہیں as long as the external interface remains constant. And again I will remind you of that old example of a motor vehicle جیسے گاڑیاں ہیں ہماری کہ جی ان کے اندر کی working جو ہے وہ تو ہر سال بدلتی جاتی ہے جیسے جیسے technology improve ہوتی جاتی ہے لیکن اگر ہمیں گاری drive کرنی آتی ہے تو ہم drive کر رہے ہیں اس کو external interface کے ساتھ یعنی steering wheel ہے starter switch ہے clutch ہے break ہے accelerator ہے یہ ہے external interface وہ تقریباں constant ہی رہتا ہے تاکہ اگر ایک car چلانی آتی ہے تو دوسی car میں بھی بیٹھتے آپ اس کو چلہ سکتے ہیں آپ کو اس چیز سے غرز نہیں ہے کہ جی پسلی car جو تھی وہ اس کا engine جا تھا اس میں carburetor لگاوا تھا distributer تھا coil تھی spark plugs لگے بھی تھے اب جو ہے وہ آپ کو ہی بری technology والی گاری چلا رہی ہیں جس میں electric motor لگی ہوئی ہے یا وہ fuel cell والی گاری ہے جس میں hydrogen جو ہے وہ fuel استمال ہوتا ہے آپ کو اس سے غرز نہیں ہے in other words the implementation can change but the user interface doesn't اس کے بعد اگر آپ دیکھیں کہ جی جو data members تھے کلاس کے now if we talk about the private data members those were normally composed of simpler variables in float car جو بھی native data types ہمارے پاس c++ میں اس کے ساتھ ہم internal data members ایک کلاس کے دیفائن کرتے تھے اس کے ساتھ arrays بھی آجاتی ہیں point us بھی آجاتی ہیں پھر dynamic memory allocation بھی آجاتی ہے but those were the inside parts of a class جس question سے میں نے آج کا lecture شروع کیا ہے وہ question یہ ہے کہ جی کیا ہم limited ہیں کہ کلاس کے اندر جو data members بنتے ہیں public home private home doesn't matter کیا وہ data members صرف native data types کے ہو سکتے ہیں یا کوئی اور بھی ہو سکتے ہیں well again if you think about it since we have constantly said that a class is nothing more than a user defined data type جیسے ہی آپ نے ایک کلاس پوری دیفائن کر لی لکھ لی تو آپ کے پاس ایک نئی data type آگئی اگر وہ data type آپ کے پاس آگئی ہے تو جہاں پہ آپ native data type استعمال کر سکتے ہیں یعنی in float car اٹسٹرہ وہاں پہ آپ اپنی defined data type بھی استعمال کر سکتے ہیں صرف اسی statement کو لے کے the answer to the question is obviously yes you can use user defined data types as members of a class now that means that a class can contain objects interesting concept but the idea is this کہ جہاں پے let's take a specific example suppose ہم نے ایک کلاس لکھی ہے اور وہ کلاس ہے ڈیٹ ہم نے پہلے بھی اس کے ساتھ کچھ کھلا بھی تھا ایک ڈیٹ کلاس بنائی تھی جس میں month day year کر کے ہم نے اس کے data members بنائے تھے پھر اس کو manipulate کرنے کے لیے کچھ functions لکھے تھے اور یہ ایک ہم نے user defined data type complete کر لی کہ جناب یہ ایک date type of variable define کرتی ہے اور یہ اس کو store کر سکتی ہے اب جب ہمارے پاس یہ ایک کسم کا سمجھ لیں building block آگیا so again my analogy always goes back to کہ ہم نے rate اور cement اور پانی سے شروع کیا اور پھر ہم نے اس کا ایک block بنالیا اب اگر block بن گیا ہے تو اس block سے بھی ہم construction کر سکتے ہیں اور original چیزوں سے بھی کر سکتے ہیں but جب block بن گیا ہے تو پھر اس سے ڈیوار بنانی اب زیادہ آسان ہے by using multiple blocks so now if we have defined a date data type we might as well start using it to define other data types think about a person مطلب ایک انسان کے بارے میں اگر ہم نے ایک object تشکیل دینا ہے we want to define a class which is of type person اس کے لیے ہم کہ سکتے ہیں کہ جو اس کا نام جو ہے ایک data member ہوگا now since the name is normally a character string we now know we can either have a char pointer and do dynamic memory allocation we can use the built-in string data type which is supplied with c++ compilers or we have multiple other options نام کے علاوہ we could use address so address بھی ایک string ہوگا so وہ بھی char pointer کر لیتے ہیں دو چیزیں ہوگئے usually we associate with human beings ایک اور چیز بھی اسوشیئٹ کرتے ہیں جو ہمارے for example شناختی کارد پر بھی لکھی ہوئی ہے یعنی date of birth so date of birth is also associated with a person now we come up with the question کہ جی date of birth کو اس کلاس کے اندر کیسے شامل کرنا ہے either we could define three integers one representing the year of birth one representing the month of birth and one representing the date of that month the day of the month دوسر طریقہ یہ ہے کہ جی ہمارے پاس date data type تو already بن چکی ہے so why not define a data member of type date it's very simple no difference from using the native data types آپ اس کا data structure اگر دیکھیں we would have char pointer to name char pointer to address and date date of birth so we define a variable as a data member جس کی data type is nothing more than one of our predefined a user defined data types یہ استمال کر کے we can just construct a class so constructable reuse of code has happened یعنی جتی ہم نے افرٹ لگائی تھی date class لکھنے میں وہ اب بغیر ایک اور line لکھیں ہم درکہ اس کو استمال کر سکتے ہیں in defining a new class دیکھیں یہ جو declaration ہم نے کی ہے as a data member ہم نے کہا ہے date date of birth آپ دیکھیں گے کہ اس کے ساتھ میں کوئی initializer نہیں لکھا تو کیا مطلب اس کا default constructor call ہو جائے گا the answer is no if you recall جب ہم class define کرتے ہیں تو اس کے لیے کوئی memory allocate نہیں ہوتی it is the definition of a data type memory تو اس وقت allocate ہوگی جب اس کا کوئی ہم object instantiate کریں گے so that has to come later suppose ہم date کو initialize کرنا چاہتے ہیں یعنی وہ date data member جو person کے اندر بیٹھا ہوا ہے so question is پہلے کہ جی ہم q initialize کرنا چاہتے ہیں number 2 کب initialize ہوگا and number 3 کیسے کیوں کی بات تو یہ ہے کہ جی ہم person object جب create کرنا چاہیں گے ابھی تو definition ہے نا class definition کی بات ہو رہی تھی اب ہم جب person object create کرنے جا رہے ہیں تو normally ہمارے پاس کوئی constructor ہوتا ہے اگر ہم نے اس person object کے لیے ہم نے اس کا نام اور پتا دینا ہے تو ہم چاہیں گے کہ constructor جو ہے وہی اس کو assign کر دے تو اگر وہ constructor نام اور address اس کو assign کر رہا ہے might as well use the same constructor to assign the date of birth for this you have to understand the order in which things are executed جب ordinary variables تھے as data members تو وہ تو سمجھنے کے جی language کوئی پتا ہے compiler کو بھی پتا ہے جنب یہ exist کرتے ہیں اور مجھے اس کے بارے میں سب کچھ پتا ہے memory کیسے الوکیٹ کرنی and so on so forth جب ہم اپنی کسی class کا ایک object وہ class کا data member بنا دیتے ہیں تو this question must arise in your head جنب now person object پہلے بنے گا یا date object پہلے بنے گا well the answer is کہ اگر یہ date object class کا member نہ ہوتا تو کیا 4 pointer پہلے بنتا یا person پہلے بنتا answer is obvious کہ جی 4 pointer تو built-in ہے وہ پہلے سے بنا ہوئے اسی طریقے سے اگر native data types پہلے سے exist کرتی ہیں تو جب بھی ہم کوئی اپنے user defined data type define کر دیتے ہیں as a member of a class what happens is کہ جی پہلے وہ والا object create ہوتا ہے وہ جب object بن جاتا ہے تو پھر بہر والا object وہ create ہوتا ہے so there is an order of creation and this is basically the reverse of the order of destruction now lets think in terms of how to get an initializer right into the person class so that the daate of birth is also initialized to do that ہم person کاcıkuu want to Ugh list a جس کے اندر نام بھی ہے اور پتا بھی ہے اور اس کے بعد ہم تین اس کو انٹیجرس دینا چاہیں گے جوکہ ڈے، منت اور ڈیر جو ڈیٹا میمبرز ہیں ڈیٹ اوپجیکٹ کے ان کی بھی ویلیوز ہم پرسن کے کنسٹرکٹر کو پاس کر دیں سو اتنا پرسن کے کنسٹرکٹر کی کال تو بڑی سیمپل ہو گئے وہ تو ہم نے لکھلی آپ پرسن کے انسٹرکٹر کے اندر جاکے کیا ہم ڈیٹ کے ڈیٹا میمبرز کو ہم چینج کر سکتے ہیں نواملی اگر آپ کے پرسن ڈیٹ کا کوئی ڈیٹ کو کنی ڈیٹ کیا ہم ڈیٹ ڈیٹ کلاس کے پبلک ڈیٹ میمبرز میں ڈیٹ کر چکے ہیں تو ان کو تو استعمل کرکے ہم اس کا ڈیٹ ڈیٹ ڈیٹ ڈیٹ کر ہی سکتے ہیں یہاں مطلب یہ ہے کہ یہ دیت آبیٹ کا کنسترکٹر جو ہے وہ پہلے کال ہو چکا ہوگا before the person object comes into being that means the date object now exists and then the person object comes into being if you think about what I have just said اگر ہم پرسن کے کنسترکٹر کے اندر جاکے date object کو انیشلائیز کرتے ہیں تو date object has already been constructed اس کا کنسترکٹر چل چکا ہوا ہے اور پھر ہم اس کے set functions کے ساتھ day month or year کی value سیٹ کریں گے is it okay yes it's okay but it is slightly wasteful because if we have a constructor date جوکہ day month year کی value لے کے ایک properly initialized date object ہمیں واپس کرتا ہو تو then we should call that constructor to construct the date object for us with the values for that birth date in there and then use that fully constructed object in the person constructor without having to initialize it anymore کوئی assignment یا set member function کی ضرورت نہیں ہونی چاہیے اس پوری چیز کو implement کرنے کے لیے ہم ایک چیز استعمال کرتے ہیں جس کو کہتے ہیں initializer list initializer list جو ہے وہ نمالی constructor کی پوری call کے بعد لکھی جاتی ہے اور اس کا syntax جو ہے وہ آپ دیکھ لیں آپ کے handouts میں بھی ہے کہ جو constructor کے پرانثیسیز جو ہیں function call ہی ہے اس کے جب پرانثیسیز ختم ہوتے ہیں وہاں پہ ہم ایک colon لکھتے ہیں اور colon کے بعد آپ کی initializer list چرو ہو جاتی ہے کہ یہ constructor ایکسیکیوٹ کرنے سے پہلے اور کیا کام کرنا ہے وہاں پہ آپ date کا constructor کو call کر سکتے ہیں اور جو person کے constructor کو ہم نے arguments پیش کیے تھے یا بھیجے تھے یعنی ہم نے وہ 3 integers بھی بھیج دیو month ڈیر کے لیے وہ ہی integer variables اب آپ date کے constructor کو pass کر سکتے ہیں لہذا if you look at the syntax it's quite simple it's not difficult you have the prototype for the person constructor جس کے اندر اب 5 ہم arguments پیش pass کر رہے ہیں 2-4 pointers ہیں یعنی strings ہیں which are holding the name and the address and we are also passing 3 ints representing the day month here اور پھر without going into the constructor itself اس کی body میں بھی جانے سے پہلے ہی ہم colon ڈال کے لکھتے ہیں date کا constructor اور date کے constructor کو وہی 3 day month here کے جو variables تھے جو بھی ان کا نام دیا ہوئے ij کے day month here whatever you want وہی آگے لکھ دیں گے what happens is now دیکھ لیں اسے ہوگا کیا جب آپ کا person constructor call ہوگا تو constructor چلنے سے پہلے date کا constructor call ہو جائے گا اور date کا constructor جب call ہوگا اس کو یہ values pass کر دی جائیں گی now if your date object was properly defined and I hope it was کہ جی اس کے اندر 3 integers دیے جائیں تو it returns a properly constructed date object with the day month and the year values already set تو date initialize ہو جائے گی اب person کا constructor چلے گا اور اس کے اندر date object is already constructed so all you need to do is assign the name and the address so you don't need to call the set functions wasteful میں نے پہلے کہا تھا ہوتا ہے because if you give default constructor یعنی initializer list نا استعمال کرتے that means کہ جی constructor تو اس کا call ہو جاتا اور پھر اوپر سے آپ کو 3 اس کے member functions علیادہ سے call کرنے پڑتے to set the values for date so it is in a way better to use the initializer list and it's more obvious also نظر آ جاتا ہے کہ جی person construct کرنے سے پہلے date construct ہو رہے it is not limited to this suppose it had another object also as part of the data member of the class person تو یہی initializer list کنٹنو کر سکتی ہے from a computer terminology perspective یہ خیال رکھیں کہ جنرلی whenever we talk about a list it is a comma separated list of values اسی طریقے سے جب ہم initializer list کی بات کرتے ہیں it means 1 initializer آئے گا comma, 2nd initializer آئے گا comma, 3rd آئے گا اگر آپ کے پاس ایک سے زیادہ objects ہوں as members of another enclosing class تو اس کی initializer list یعنی ان کے constructors جو ہیں اس طرح سے list کیے جا سکتے ہیں ایک colon کے بعد ان کی list چرو ہو جاتی ہے کس order میں call ہوں گے یہ کوئی left to right right to left order نہیں ہے اس کا خیال رکھئے گا یہ order ہوگا class کے اندر جیسے ان کی definition ہوئی ہے اگر پہلے date define ہوئی ہے تو date کا constructor call ہوگا suppose there is another date let's say the date of a driving license as part of the person class وہ اگر بعد میں define ہوئی ہے تو اس کا constructor بھی بعد میں call ہوگا and as I mentioned earlier the destructor calls are in the reverse sequence جیسے میں آنطور پہ آپ کو کہتا ہوتا ہوں اس کام کو کرنے کے لیے you should write your own little code and experiment with this it is important to know کیا پہلے کیا ہوتا ہے because you don't have direct control over these things what you should do is you should define a person class you should define a date class or person class کے اندر date کا ایک data object a member رکھیں person class کے اندر اور ہر چیز کے constructor کے اندر یہ نہیں date کے constructor کے اندر بھی کوئی see out کے ساتھ statement ڈال دیں saying inside date constructor اور اسی طریقے سے person کے بھی constructor میں ڈالیں see out inside person constructor اور ان کے destructors بھی ڈیفائن کریں جس کے اندر صرف یہ see out statement پڑی ہو کے جی inside dates destructor اور inside persons destructor اس کے بعد ان کے کوئی ایک سیمپل سا function لکھنے جو کہ ایک object ڈیٹ کرے اور ختم اور کچھ بھی نہ کرے you will notice کہ آپ کے console screen کے اوپر یہ order آجائے گا کہ کنسی چیز پہلے ہوئی ہے کنسی چیز بعد میں ہوئی ہے and easy way to track these things and you will notice کہ پہلے date object ڈیٹ ہوگا پھر person object ڈیٹ ہوگا اور جب یہ destroy ہونے لگیں گے تو پہلے person object ڈیٹ ہوگا پھر date object ڈیٹ ہوگا now even that if you think about it makes logical sense جب تک ہم نے embedded objects ڈیٹ نہیں رکھے تھے اُتنی دیرتاک تو we were talking نیٹف ڈیٹاٹائک سیستمال ہو رہی ہیں ایک کلاس کے اندر اب ہم نے جب اپنے object ڈیٹ رکھ دیا ہے you can think ڈیٹ پہلے enclosing object ڈیٹ which was the person class پہلے وہ ختم ہوتا ہے وہ جب ختم ہو جاتے تو پھر اس کے تکڑے ہیں ان کو free کیا جاتا ہے اگر int 4 ڈبل float یہ اس طرح کی چیزیں تھی وہ native ڈیٹاٹائپس ان کو free کرنا آتا ہے لیکن اگر کوئی object ڈیٹ like date تو پھر after the person has been destroyed the date is destroyed ان insbesondere the sequence of events is quite clear but you should prove it to yourself چکلیں مسارے جو거든ہ Of construction and destruction اس کے لیے ایک example ذرا work out ڈیٹ آٹے ہیں Have a clear concept لیکuffs ڈیٹ Let us start with the class called过 полез ڈیٹ لیک Freeze العمنان طریقی وosen супiner quarto ٹی کویcommzą مندیows because many concepts کیونہیں could explain اسے آگے چلتے ہیں. Let's define a second class called row. Row class کا پھر ہم کہتے ہیں کہ دی ایک ڈیٹا میمبر ہے which is size. Normally اگر دیکھیں اگر concept میں name size ہم نے رکھتی ہے تو اب اسی کے ساتھ چلتے ہیں. Otherwise column کا ہم number of elements کی بات کر رہے ہوتے ہیں. Row کا ہم number of elements کی بات کر رہے ہوتے ہیں. یہاں پہ آپ جب جو ہم define کرنے چلے ہیں تو ہم کہیں گے یہ ایک row میں کئی columns ہوتے ہیں. So ایک row میں we can think of ہی جانتے ہیں as being a column. So we will have int size as a data member and will also have a column as a data member. So ایک embedded class آگئی جانی row class کے اندر ایک data member جو ہے is of our own user define data type of type column. So اس کو ہم نے call c نام دے دیا یا call نام دے دیا جو بھی ہمہا دل کرے اور پھر اسی طریق سے ایک set function لکھلیں جو کہ size کو سیٹ کر سکے. Constructor جو ہے اس کے اندر لکھیں کہ جی inside constructor for object row تاکہ ہمیں پتہ چل سکے کہاں پہ ہے اسی طرح جیسے column میں بھی ہم destructor ایک دال دیتے ہیں کہ جی column destroyed row میں بھی ایک destructor دال دیں row destroyed وہ display کرے سکرین کے اوپر. So اب ہماری حیرار کی دیکھیں کیا بن رہی ہے. پہلے ہم نے ایک column class declare کی چھوٹیسی چیز ہے دو تین بیچ میں functions ہیں ایک data member ہے اس کے بعد ہم آگے ایک row class کے اوپر جس کے اندر ایک اس کاپنا data member ہے int size اور دوسرا data member جو ہے وہ column ہم نے دال دیا اس کے اندر اور اس کے پھر وہی set اور display functions دال دیا. Constructor ڈال دیا destructor ڈال دیا اس سے آگے چلتے ہیں اب ہم ایک نئی class introduce کرتے ہیں اس کو کہتے ہیں column class matrix اگر class ہم matrix ڈیفائن کرنے چلے ہیں تو as per our embedded structure اس میں row ڈالنے سے ہمارا کام بن جاتا ہے لیکن چلے ہم int size بھی رکھ لیتے ہیں although اس کا کوئی مطلب نہیں ہے it's a very contrived example basically the idea behind this example is just to see the sequence in which things happen. So class matrix کے اندر ہم ایک member object یا member class کا ایک data member بنالیتے ہیں اور وہ ہے row type data member اور پھر اس کا بھی constructor ہوگا matrix created display کرے گا اس کا بھی ہم destructor لکھ لیتے ہیں جو کہے گا matrix destroyed یہ تین classes لکھنے کے بعد ہم چلے جاتے ہیں اور اپنا main function لکھتے ہیں اس میں ہم کہتے ہیں کہ ایک object create کرو matrix m create ہو گئی اس کے بعد ہم چلے کہ دیتے ہیں m.display جو بھی matrix come display کرنا چاہتے ہیں and that basically is it ہم اور کچھ نہیں کرنا چاہتے ہیں اس program کو اگر آپ کمپائل کر کے چلائیں گے تو what happens is جیسے ہی matrix create ہوتی ہے تو وہ constructors call ہوتے جائیں گے inline you will notice کے جی matrix کو create کرنے کے لیے آپ کو ایک row کا object create کرنا پڑتا ہے اور row کو create کرنے کے لیے ایک column کا object create کرنا پڑتا ہے جو ابھی میں نے آپ کو پہلے بتایا کہ جی column کا object جو inner most ہے وہ actually سب سے پہلے create ہوگا جب column کا object بن جائے گا تو ایک row کا object بنے گا جس کے اندر column object ہے جب row کا object بن جائے گا تو پھر matrix object بنے گا جس کے اندر row کا ایک element ہے so you will see the constructors in that order saying column constructed then you will see row constructed and then you will see matrix constructed اس کے بعد آپ نے کوئی function call کرنی ہے تو کرنے لیکن جا program ختم ہوتا ہے تو you will notice کے جی پہلے سب سے بہر والی چیز which is the matrix matrix destroyed اس کے بعد اس کے next level row destroyed اور اس کے بعد اس کا next level column destroyed so you will be able to see the sequence of events اسی طریقے سے اگر آپ کوئی parameters pass کرنا چاہیں تو initializer list یاد رکھیں you can pass a size value to the constructor of the class matrix which can then pass that size value through an initializer list to its member object of type row or row کا constructor جو ہے that can in turn pass that element size as through an initializer list to its own enclosed data object which is of type column so it's quite interesting لیکن again یہ چیزیں جو ہے دیکھیں we have not introduced anything new other than maybe کے جی initializer list کے ہم نے بات کر لی ہم صرف کر رہے ہیں استعمال ہمارے existing knowledge کو کتی کلاسز اور ان کی instantiation یعنی objects ان کی استعمال کی بات ہو رہی ہے just to recap since the classes represent user defined data types we can use them where ever we use the native data types so a class can have other objects as data members صرف جس کیز کا خیال رکنا ہے کنسی چیز پہلے create ہوتی ہے کنسی چیز destroy ہوتی ہے کہاں سے آپ اس کو دیکھ سکتے ہیں اس کا انتفیس کیا ہوگا public visibility کیا ہے private visibility کیا ہے by enclosing a class object inside another class کو visibility میں کوئی چیج نہیں آتا یعنی جو بھی rules row نے یا column نے enforce کیا ہے اس کی enclosing class کے اوپر وہ rules apply کریں گے if you want to have any access to a public member of an enclosed object you can use a dot dot dot notation you could say matrix dot row dot column dot size اگر یہ چیزیں public ہوتی تو اگر size public ہوتا تو پھر آپ یہ استعمال کر سکتے ہیں and you can resolve the visibility of these objects other than that it's just think about it کیجی اس کا کوئی فائدہ ہوتا ہے فائدہ تو سیمپل یہ ہے کیجی existing building blocks کو لے کے ہم نے زیادہ complex objects create کر لیے دیت کلاس کا میں دیت اگر defined ہے تو ہم نے person object میں استعمال کر لی ریزوز of code کہیں ہورا ہے think about it دیت تو ایک بڑا جناریک اسم کا object ہے دیت پرسن میں بھی جاتا ہے دیت کسی کسم کی document میں بھی جاتا ہے driving lessons کا اگر object بنا رہے ہیں اس میں بھی جائے گا ایک check لکھ رہے ہیں اور check کا اگر ہم نے کوئی class define کی ہے اس میں check date جو ہے وہ بھی date object جائے گا so date is very generic it is used all the time nonetheless even in other situations where you have maybe not a class which is of such universal use it is still better to start encapsulating things جہاں پہ ان کا جو اپنی manipulation ہونی ہے ان کا اپنا data structure جو ہے وہ ایک well defined طریقے سے encapsulate ہو جائے اور پھر اس بند دبے کو which is our user defined data type اس کو ہم زیادہ complex building blocks کے اندر استعمال کر سکیں and again to take an analogy from the real world you should always think in terms of کیجی کوئی بھی چیز بنانی ہو تو اس کے دو طریقے ہیں ایک تو آپ بیسک مٹیریلز کے ساتھ شروع ہوں اور پھر اس سے بنا بنا کے آپ end result اچیب کریں دوسرہ طریقہ یہ ہے کہ جی بیسک مٹیریلز سے پہلے کوئی intermediate مٹیریلز تحیار کر لیے جائیں اور پھر ان سے کوئی اور complex چیز بنائی جائے مجھے for example woodworking کا شوک ہے مجھے میں بناتا رہتا ہوں لکڑی سے چیزیں بناتا رہتا ہوں now اگر میں نے ایک پکچر کا فرم بنانا ہے میرے پس دو option ہیں یا تو میں بزار سے جا کے ایک لکڑی کا تودہ خریدو امین ٹکڑہ huge block اور پھر میں رندہ چلا ہوں آری چلا ہوں اور اس کے اندر سے سٹرپس نکالوں اور سٹرپ سے پھر کارٹ پیٹ کے میں ایک فرم فیشن کروں دوسر طریقہ جیسے آپ کو پتا ہے اگر آپ لکڑی کی دکان پہ جائیں تو نہ صرف آپ کو لکڑی بھی ملتی ہے لیکن شیٹس بھی مل جاتے ہیں آپ کو سٹرپس بھی مل جاتے ہیں جن کو ہم گولے کہتے ہیں پکچر فرمز کے لیے بھی بنے ہوئے پورے سیکشنز مل جاتے ہیں ساتھ فٹ لنبہ اور پورا اس کے اندر دیزائن بنانا ہوں تو کیوں میں راہ لکڑی کے ساتھ شروع کروں بایشنٹ ہے سمکل بای اسٹرپ which has already got all the دیزائنس on it اور اس کو میں کارٹ کے سمکل چاہر سٹرپس کے اندر ایک فرم بنا لوں that is again the concept of encapsulating objects within classes کیجی اگر آپ ایک کلاس بنالیتے ہیں جس کا reuse ہو سکتا ہے تو دوسی دفعہ آپ کو وہ کوڈ نہیں لکھنا پڑے گا you will be simply using the objects that you've already created or rather the classes that you've already created and use them as data members within new classes which are more complex وہی لکڑی کا گر اگر اجامپل لے لیں تو ہی لکڑی کی جو سٹرپس ہیں ان کے ساتھ صرف فرم نہیں بنتا اس کے ساتھ دس ازار اور چیزیں بن جاتی ہیں یہ جو ہمارا سٹ ہے جو آپ دیکھ رہے ہیں یہ بھی لکڑی کا بنا ہوئے تو اگر میں جو کسی بہت پیسے کیا جو already کٹ ان شیپت میں could use them for 10 دفعہ پرپزز میں could use them in creating new classes of objects object یا کلاس جو ہے set کلاس جو ہے picture frame class جو ہے box anything like that but you have used ایک pre developed object یعنی pre developed class کو استعمال کر لیا ہے in developing more context things this is basically could reuse اور سب سے زیادہ فیدہ جو ہے object oriented programming کا اور اس اپروچ کا وہ یہ ہے کہ جی back to our date class جب ہم نے date class لکھی اس کو develop کیا اور اس کو استعمال کیا اور صرف as date استعمال کیا تو ایک اسم کی ساری debugging تو ہو چکی that code is fully debug it is fully working اس کے اندر کوئی ارر نہیں بچا وہ نہیں بچا تو وہ ہماری لیبرری میں چلی گئی as a building block next time we don't even have to worry about کیو اس کے اندر کیسے لکھا تھا we just pick it off the shelf and use it in a new class knowing کہ یہ کام ہوتا ہے یہ چلتا ہے کوڑ اس کے اندر کوئی ارر نہیں ہے ہم نیا کوڑ اس کے اوپر add کریں اور کوئی بڑی class یا more complex class develop کر سکے just a final fine point before you move on کئی دفعہ ہم جو data members ہیں ان کو const declare کرنا چاہتے ہیں they are constants for that object for example person جو ہے اس کے اندر you could easily think off کی جی اس کی date of birth تو constant ہونی چاہیے once we create an object اس کی date of birth fix ہو گئی date of birth doesn't change age changes but date of birth is a constant تو if you create a person class اور اس کے اندر آپ لکھتے تھے a constant date date of birth you have to immediately worry about initialization وجہ اس کی کہ constant object جو ہے وہ ایک دفعہ create ہو گیا تو اس کے بعد اس کو value assign نہیں ہو سکتی so you have to provide a constructor which is parameterized and you have to use an initializer list otherwise وہ default initialization پے چلا جائے گا اگر آپ کو ہماری وہ date class یاد ہے تو وہ شاید January 1st year of 00 initialize ہوتی تھی اگر آپ person object create کرتے وقت اگر اس کی date of birth کو initialize نہیں کریں گے تو what you will get is a person object with a constant date date of birth initialized to January 1st year 00 اس کے بعد set functions نہیں چلیں گے آپ نے تو constant لکھتی ہے اس کے سامنے so set functions will fail in fact the compiler won't even compile the program so you have to be careful you must provide a constructor which takes the necessary arguments and then use the initializer list whenever you are using constant objects within classes moving on اگر آپ کو یاد ہو اگر آپ کتاب بھی پڑھتے رہے ہیں اور لنگوچ دیکھتے رہے ہیں we could define a structure inside a structure جب ہم لنگوچ پڑھ رہے تھے or structs or unions کی بات ہو رہی تھی تو struct کے اندر بھی struct define ہو سکتا ہے پہلی چیز structure اور classes میں فرق کیا ہے کچھ یاد ہے آپ کو c++ میں structure and classes are very very very similar they are basically user defined data types دونوں کے اندر data members and functions i.e. member functions to manipulate that data موجود ہو سکتے ہیں c والے struct میں نہیں ہو سکتے ہیں c++ میں ہو سکتے ہیں فرق یہ ہے جو c++ کا struct ہے اس کے اندر default visibility is public کینی اگر آپ کچھ نہیں لکھتے اور struct کے اندر کوئی data members or functions لکھتے ہیں they are public by default اور class کے اندر the default visibility جو ہے وہ private ہے کچھ نہ لکھیں تو ہر چیز private ہو جائے گی explicitly اس کو public colon لکھ کے اس کا interface define کرنا پڑے گا یہاں تاکہ اگر آپ سمجھ لیں کہ these struct اور class essentially are very similar اور صرف اس کے اندر یہ private اور public visibility کا فرق ہے تو you realize کہ جو کچھ میں نے ابھی تاک آپ کو بتایا of using classes as data members within another class you can use structs no difference but now moving on struct کے اندر ہم struct define کر سکتے تھے we could have defined a structure inside a structure the question here is can we define a class inside a class well i will only talk about classes inside classes but you should realize کہ جو کچھ میں کلاسز کے لیے کہہ رہا ہوں وہ struct کے لیے بھی valid ہے یہ نہیں میں بتانے لگا ہوں آپ کو کہ ایک کلاس کے اندر آپ پوری کلاس define کر سکتے ہیں ابھی پہلے جو ہم نے بات کی تھی وہ کی تھی کہ جی بہر ہم نے کلاس پوری develop کی ہوئی ہے اور اپنی نئی کلاس کے اندر اس کو استعمال کر رہے ہیں for defining a data member now i am talking about within a class we define a new class یہ ایک اور level of encapsulation ہے اور ہاں ماہ遠ح حیات Raymond religiousLet's just move on and see how we define a class inside a class it's fairly simple in fact there's nothing complicated about it if you look at the code examples that we've given you we start the class definition or ...... nothing new اس ہم ایک دوسر کلاس کے دوسری کلاس کے اندر دیفائن کی جا سکتی ہے۔ اس کے سارہ دیتا سٹرکچرہ آپ بلکل اس طرح لکھیں گے جیسے عدنری بہر ہم کلاس کا لکھتے ہیں۔ اسی طرح اُس کا انترفیس دیفائن کریں گے، پبلیک اور پرویوٹ ویزبیلتی کی طرح۔ اور اس کے سارے کلاس کے اندرمی پاس کسی طرح دیتے ہیں۔ باہر ہم کلاس کا لکھتے ہیں核 conferences اسی طرح اس کا انٹرفیس ڈیفائن کریں گے پ conscious or private visibility بیلیٹی کی طرحant then you can start writing its member function which you can write outside of the enclosing classroom or you can write in side وہ اس میں تھوڑی سے فرقاتی've لیکن nothing new nothing rocket science something more complicated perspective on life again is there a reason for doing so ریزن اس کا سمپل یہ بنتا ہے کہ جناب آپ کافی کمپلکیٹڈ چیزوں کو ایک جگہ میں ایک کٹھا کرنا چاہ رہے ہیں if you can collect them into one simple place then it is better because it leads to easier manipulation of your objects when we start defining a class within a class ایک کرلیں، دو کرلیں، تین کرلیں as long as کوئی coherence ہونی چاہیے جیسے اب یہ ہم نے matrix کا ایک سامپل کیا you could have thought کہ جی matrix کی اندر ہی row بھی define کرلو column بھی define کرلو as member classes now it's different from objects now we talking member classes یاد رہے کہ جب ہم class کو define کرنے جاتے ہیں اس وقت نہ اس کا کوئی object ہوتا ہے نہ کوئی memory allocation ہوتی ہے کچھ نہیں ہوتا it's a definition of a user defined type here when we define a class inside another class the same thing holds it's simply a definition جب تک وہ اندر والی class کا کوئی object نہیں ہم declare کرتے within the class definition اس وقتہ کہ یہ پڑی رہے گی اس کے لیے کوئی memory run time پے بھی allocate نہیں ہوگی nonetheless when we define or rather when we declare کہ کوئی enclosing class جو بہر والی class ہے اس کا ایک data member جو ہے that is of type of the class defined inside اور پھر جب جاکے آپ بہر والی class کا کوئی object create کرتے ہیں اس وقت جاکے ساری memory allocations ہونے لگ پڑتی ہیں now this is not something that you use very often it is quite rare but sometimes when you get into really complicated big programs you might want to use this feature and put the whole thing inside a bigger box یہ آپ اس کا تصور اسی طرح سے کریں وہ جو ہمارا extended بچ پن میں دیکھتے آئے کہ یہ دبہ کھولا اس میں چھوٹا دبہ پہے چھوٹا دبہ and so on this is exactly like that a class inside a class it's a full box a full definition enclosed completely within an outside box اب یہ بہر independent class نہیں ہے یہ اس کے اندر ہے فائدہ اس کا یہی ہے کہ یہ آپ ایک جگے پے data structures کو کون سولیڈیٹ کر سکتے ہیں while treating and programming these data structures in a way independently کیونکہ اندر والی بھی ایک کلاس ہے اس کو آپ ایک سیمپل کلاس کے طور پہ سوچ کے پورہ دیویلپ کر لیتے ہیں اور پھر کہتے ہیں یہ بہر والی کلاس کے اندر دیفائند ہے اور اس کا پھر objects کیٹ کریں which becomes ordinary which become ordinary data members of the enclosing class کوڑ کو آپ ضرور ریویو کیجئے گا what you have to start worrying about is کونسی چیز کو ہاتھ لگایا جا سکتا ہے کونسی کو نہیں normally the visibility or the accessibility of the enclosed classes is dictated by themselves in other words your enclosed class نے چیز private کر دی وہ private رہے گی your enclosed class نے چیز public کر دی وہ بہر والی کلاس کے استعمال میں آ سکتی ہے you can call public member functions of an enclosed class you cannot call private member functions of an enclosed class nonetheless again we have a tool available جسے ہم یہ private اور public access کو تھوڑا سا relax کر سکتے ہیں آپ کو یاد ہوگا وہ تول جو ہے اس کو ہم friend کہتے ہیں اگر کوئی اندر والی کلاس نے بہر والی کلاس کو کوئی access دینا ہو تو وہ بہر والی کلاس کو friend declare کر سکتی ہے now it sounds a little strange کہ جناب بہر والی کلاس کے تو اندر ہے enclosed class تو پھر friend کی کیا ضرورت ہے nonetheless the private and public access rules are completely applicable you have to explicitly give access پھر تھوڑا سک chicken and egg والی situation آ جاتی ہے جب آپ friend access کے اندر جاتے ہیں کہ جناب پہلے کلاس کا پتہ ہو تو پھر ہم اس کو friend بنا سکتے ہیں now suppose we have an outer class called class outer اس کے بعد ہم اس کے اندر جاتے ہیں اور کہتے ہیں class inner ہم چاہتے ہیں کہ جی outer class وہ اپنے آپ کو بھی friend declare کر دے inner class کو دوسرا رستہ صرف آسان ہے یعنی بہر outer آگئی اس کے بعد inner آئی inner اگر کہتی ہے کہ جی friend outer تو data exchange ہو سکتا ہے in one direction ہم چاہتے ہیں کہ جی اندر والی کلاس بھی بہر والی کلاس کا private data کو access کر سکے so bhar والی کلاس اپنے طور پہ وہ define کرے گی کہ جی inner جو ہے وہ میری friend ہے only then will inner have access but class inner has not yet been defined so جو پہلے ہم استعمال کرتے ہیں technique ایک سمپل لائن ہم لکتے ہیں class inner semi-colar کینی class outer کے بعد اندر اس کی definition ہم نے simply ایک لائن لکتی class inner that says that the inner is a class کیا ہے وہ بعد میں آتی رہے گی لیکن ہم نے declare کرنے کے بعد ہم کہہ سکتے ہیں friend inner and that means once we know it's a class and we declare it as a friend اس کے بعد اس کی definition چلتی رہے inner نے اگر outer کو friend declare کرنا ہے it's quite simple وہ اپنی definition کی اندر کرے گی outer is already available as a class so you don't have to use that forward declaration syntax again slightly complicated but look at the code you will realize it's not complicated at all it's quite logical visibility rules you have to review thoroughly کنسی چیز کہاں سے نظر آتی اور کہاں سے نہیں نظر آتی access specifiers you should review کہاں پہ dot operator استعمال ہونا ہے کہاں پہ double colon استعمال ہونا ہے member functions بہر والا object وہ اندر والی class کا member function کب call کر سکتا ہے اندر والی class وہ بہر والی class کا member function کب call کر سکتی ہے کونسا دیتا کس کو visible ہے you have to form a hierarchy and start using a simple technique that for example I use وہ ٹیکنیک ہے کہ یہگر آپ پینسل کے ساتھ ایک دبہ بنانا شروع کر دیں اور پھر اس میں دروازے بنانے شروع کر دیں تو آپ کو نظر آ جاتا ہے کہ دروازے کے اندر سے کیا چیز نظر آتی ہے اور اگر پیچھے پردہ ہے تو پردے کے پیچھے وہ private data ہے جب بھی آپ کو چیز friend declare کرتے ہیں تو in a way وہ پردے کو آپ نے side پے کر دیا and you've got access to the things behind the curtain if you sketch a little diagram you will be able to see کہ کس چیز کو کیا چیز نظر آتی ہے صرف چیز کا خیال رکھنا ہے with this very simple tool یا example جو میں کہا رہا ہوں کہ یہ دبہ بنانے اور دروازے کھڑکیاں کھولنے کہ difference یہ ہے کہ جی عام طور پہاگر ہم کمرے کے اندر پردے کو side پے کریں تو not only can we see behind the curtain if there's a person behind the curtain they can also see us in this case it is not two way traffic for classes and objects it's not two way traffic it is who declares whom a friend اگر بہر والی کلاس نے اندر والی کلاس کو friend declare کیا ہے that means کہ اندر والی کلاس بہر والی کلاس کے private data کو دیکھ سکتی ہے اگر اندر والی کلاس بہر والی کلاس کو friend declare کریں تو بہر والی کلاس اندر والی کلاس کے data structure کو دیکھ سکتی ہے so you can just conceptually do that but please review the code that will give you a better understanding of this technique ایک اور point clarify کرنا لازمی ہے یہاں پہ جب بھی ہم کلاس دیفائن کرنے چاہتے ہیں تو ہم اس کے member functions کہاں پے لکھتے ہیں just think about it inside a normal class what we do is we declare the data members and then we give the function prototypes of the member functions that's the normal way of doing things for prototypes نظر آنے چاہی ہیں because usually ہمیں وہ کلاس کی فائل علیدہ سے دینی بھی پڑتی ہے for anybody else who wants to use our class لیکن اس کا جو code ہے یعنی member functions وہ ہم علیدہ سے لکھتے ہیں کلاس کے بہر لکھتے ہیں اور پھر اس کو identity کرنے کے لیے کہ یہ اس کلاس کا member function ہے ہم وہ access specifier اس کا یعنی جو double colon ہے ہم کہتے ہیں class name double colon پھر function name اور پھر اس کی definition تو یہ جب inner اور outer classes کی بات ہوری ہوتی ہے تو inner classes کے بھی تو functions ہوں گے ان کو کیسے لکھا جائے آنسر is quite a logical extension of this concept you will write something like اگر ہمارے پاس ایک outer class ہے پھر اس کے اندر ایک inner class ہے اور suppose inner کا ایک constructor ہے تو constructor کا نام بھی inner ہوگا اس کو لکھا جائے گا دونوں کلاسی سے بہر نکل کے علیدہ سے آپ لکھیں گے outer colon colon inner colon colon اور پھر function کا نام for a constructor it is again inner parentheses اور پھر اس کی definition آئی گی بہر پاس دیکھے، اس کی نام اس کو ایک think ایک ایک mix آپ لکھیں گے ایک part ہمارے تحالیہ ایک part ایک part ایک part اس کے ایک part ایک part آپ اللہامہ اس کے اندر یہ مطلب کوئی بہت زیادہ کومنڈیوز کی چیزیں نہیں ہے بہت for the sake of completeness, this is what we have looked at today. In the first half of the lecture, we looked at using objects as data members within outer classes. This in fact is quite a common use. یہ تو آپ اپنی programming زندگی میں بھی بار بار استعمال کر رہے ہوں گے. In fact, before even you graduate, you probably will use a lot of this technique. So, using objects inside or as data members of enclosing classes is quite common and it's very very useful because it allows you to use them as building blocks of more complex objects. Using inner classes, which is classes within classes is slightly less common, but again in languages like Java. اس کا اپنے کافی آتا ہے. اور وہاں پہ جب آپ پہنچیں گے you will notice that you might be using this technique more and more. The basic concepts that we have discussed will be applicable. So you have to be aware of the order of creation and destruction. You have to be aware of visibility or inter visibility of data members or functions کسی چیز کیسے نظر آتی ہے لیکن وہ جو پہلا والا حصہ تھا that in my opinion is more common usage