 اسلام علیکم آج کے لیکچر میں ہم کچھ چھوٹے چھوٹے ٹوپکس کورت کرنا چاہتے ہیں یہ ٹوپکس وہ ہیں جو کے ایمپورٹرنٹ ہیں جب ہم details programming میں جاتے ہیں اور ویریس ٹوپکس جو ہیں وہ موٹے موٹے چیزیں ہم نے کورت کرلی ہوئی ہیں but these are fine points which are sometimes important in complex programming سب سے پہلے شروع کریں گے ہم بات کریں گے کچھ user defined manipulators کی پیشتی دفعہ ہم نے operator overloading کی تھی اور اپنی class یا اپنی objects کیلئے اور جو overloaded operators ہے in stream کے insertion اور extraction ان کو دیفائن کیا تھا اور دیکھا تھا کہ وہ کیسے بنائے جاتے ہیں آج ہم کچھ user defined manipulators بنائیں گے اس کے بعد static key word جو ہے اس کو کورت کریں گے let us start by looking at user defined manipulators جو آپ کو manipulators stream کے لیے provided ہیں c++ میں ان کی تو ہم نے کافی detail میں کافی تفسیل میں بات کی تھی اور وہ تھے جیسے set width function ہے کہ یہ output کے لیے آپ width سیٹ کرنا چاہیں تو set w استعمال کر لیں جو کہ in line استعمال ہوتا ہے see out less than less than set width 7 اور پھر less than less than کوئی بھی number output کر لے جائے یاد رکھیں کہ یہ set width وگیرا جو تھے یہ ایک دفعہ کام کرتے ہیں یعنی immediately next number جو output ہورا ہوتا ہے اس کے لیے width سیٹ ہوتی ہے and so on یہ details تو of course آپ کو کتاب میں میں مل جائیں گے دوسر reference material جو آپ کو دیا گیا اس کے اندر بھی یہ موجود ہیں آج بات کرتے ہیں کہ جی ہم اگر اپنا کوئی manipulator بنانا چاہیں وہ کیسے بنائیں گے ہم بات کریں گے parameter less manipulators کی یعنی simple see کوئی چیز like آپ استعمال کرتے ہیں and L so E and D L ایک manipulator تھا جو بنہ بنائے آپ کو ملتا ہے جو کہ ایک new line بھی دالتا ہے اور stream کو flush بھی کر دیتا ہے یعنی کوئی چیز اگر بفر میں موجود ہے اس کو وہ output کر دیتا ہے FOREIGN screen کے اوپر ہم اگر اپنا لکنا چاہیں وہ کیسے لکھیں گے پہلی چیز as always when we doing operator overloading you have to understand کہ جی اس کی position کیا ہے یہ کہاں پہ استعمال ہوتا ہے اس کے right-hand side پہ کیا آتا ہے manipulators کو اگر آپ review کریں تو آپ کو پتا چلے گا کہ جی normally left-hand side پہ extreme object ہے اب ہم manipulators کی بات کریں تو let's be very clear کہ ہم o stream object کی بات کر رہے ہیں output کے لیے so normally وہ see out object ہوگا see out لیتا ہے ایک manipulator وہ کچھ manipulation کر کے پھر کچھ return کرتا ہے اور normally یہ in line چونکہ cascade کیا ہوتے ہیں so we have written something like see out less than less than manipulator and then less than less than some other data or maybe another manipulator and so on اس cascading سے آپ کو ایک بڑا موٹا سا hint مل رہے کہ جی یہ manipulator نے کرنا کیا ہے یا اس پے لبازمات کیا ہے the point is if the left-hand side is going to be an o stream operator o stream object rather اور اس نے call کرنا ہے تو اب return تاپ کیا ہونی چاہی ہے اور manipulator کو نظر کیا آئے گا normally manipulator کے right-hand side پے ایک اور stream insertion operator ہوتا ہے یعنی less than less than پڑا ہوتا ہے ہم بات کر رہے ہیں non parameterize یعنی parameter less manipulators کہ یعنی اس میں کوئی ہم نمبر وگرہ pass نہیں کریں گے چھوٹا سا کوئی کام کریں گے something like inserting a tab between two numbers formatting کے لیے یا line end کرنے کے لیے یا گر بیل بجانی چاہیں کنٹرول جی اگر دبائیں گے تو آپ کا پتہ آپ کا کمکیوٹر بیپ کرتا ہے اس کو نواملی ہم بیل کہتے ہیں وہ کرنا چاہیں and so on so the left-hand side is an o stream object there are no other parameters so it will receive something and the right-hand side normally is a stream insertion operator so we don't have to do anything about that اس کا مطلب اب اس کا syntax کیا ہوگا جب بھی see out کے بعد double less than sign کے بعد ہم منیpulator لکھتے ہیں یہ بزاتے خود ایک action ہے جس طرح سے ہم نے stream insertion operator کو overload کیا تو اس کو ہم نے کہا تھا کہ جی کیوں کہ ہم cascade کرنا چاہتے ہیں تو اس کو return بھی ایک o stream object کرنا چاہیے اور more accurately a reference to an o stream object منیpulator کو اگر دیکھیں تو یہ بھی بالکل ترتیب میں اسی جگے پہا رہا ہے لہذا manipulator itself should also return a reference to an object of type o stream لہذا ہم see out ہی واپس کرنا چاہیں گے یا جو بھی o stream object ہم استعمال کر رہے ہیں number 2 کہ اس کو اس کوئی چیز پاس ہونی چاہیے کہ جی کونسا object ہے جو اس کو call کر رہا ہے اب یہ class وگرہ کی بات نہیں ہوری کیونکہ class تو بن چکی وہ ہمارے control میں نہیں ہے o stream class we can only extend it by defining external things so it is not a member function or a member operator it is a stand-alone operator normally o stream کہ یہ جو ہمارے manipulators ہیں انکہ definition یا declaration syntax جو ہے وہ کچھ اس طرح سے ہے کہ return type which will be o stream and so it's a reference to an object of type o stream اس کے بعد manipulator کا نام اور اس کے بعد کیونکہ یہ member نہیں ہے ایک اسم کا friend سمجھ لیں لیکن it's not explicitly a friend we can't define anything as a friend وہ تو ہمارے control میں نہیں ہے but اس کو جو argument pass ہو رہا ہے وہ ہی object ہے جو اس کو call کر رہا ہے وہ ہمیں explicitly pass کرنا پڑتا ہے وہ بزاتے خود بھی it's a reference to an o stream object so the manipulators declaration line looks like o stream and name of manipulator and then within parentheses o stream and os os ہم دے دیتے ہیں کوئی temporary which refers to the o stream object once we've got this declaration line اس کے بعد جب ہم definition کی طرف جاتے ہیں the definition is just another function as always we can write whatever we want inside that function but again we have to look at the spirit of the manipulator when we're talking about the spirit of a manipulator we're saying کہ یہ اور کوئی کام نہ کرے یہ صرف کوئی اپنا چھوٹا اوٹپوٹ کے حوالے سے کچھ کرے اور واپس ریٹرن کر دے اور ریٹرن تاپ ہم نے دیفائن کی ہوئی ہے so normally it's as simple as return os اگر ہم نے o stream object لکھا تھا تو we say return os less than less than something it may be a tab character it may be a bell ring the bell on the on the computer or something like that اس کے دو تین چار اگزامپل آپ کو دیے گئے ہیں ہندوٹس میں بھی ہیں کچھا ہم یہ سکرین پے بھی دکھا دیتے ہیں آپ کو تو اس سے آپ کو idea ہو جائے گا it's a very simple process we can write something like a useful utility manipulator لائن ختم کرنی ہے کیا کریں دو لائن ہے اپس میں چھوڑنی ہے خالی چھوڑنی ہے کیسے اپریٹ کر رہے جائے ایسی طرح but remember it has to return an object of type o stream or a reference to an object of type o stream and it also automatically gets that object as a parameter passed into the function let's go on now manipulators and let's go on how to how do automatically get the when the you I to The app needed for that I can't show my my I what کہاں پہ استمال ہوتے ہیں and how do we can make use of them. Static as the word implies are variables which exist for a certain amount of time which is longer than an ordinary automatic variable. Let's take a look at some example پتھا چلے کی جو ہم Static ہم کس کو کہنا چاہتے ہیں Let's look at number one, the lifetime of a data variable. دیکھا ہمار پس دیتہ ویریبلز ایک تو ہے global type کے. Global data variable کنسا ہے جو کہ کسی بھی function سے بہر define ہوتا ہے اگر آپ مین سے بھی پہلے اور کسی کلاس کے اندر نہیں but stand alone اکیلہ لائن پی آپ لکھ دیتے ہیں int i تو i جو ہے it is now a global variable وہ نہ صرف main کے اندر سے accessible ہے but جتنے بھی آپ کے functions ہیں اس program میں وہ i کو handle کر سکتے ہیں they can assign a value to i اور they can obtain the value of i it is considered global global variables جو ہیں they come into existence جب بھی ہم program چلاتے ہیں اس وقت i کے لیے memory میں جگے allocate ہو جاتی ہے it exists all the time that the program is running اور جب program ختم ہوگا اس وقت i کی جگے جو ہے جو memory allocate ہوئی ہے وہ deallocate کر کے operating system کو واپس دے دی جائے گی so it has a very very long lifetime جب بھی ہم چاہتے ہیں کہ کوئی ایسی value ہو جو کہ program میں ہر جگے پر exist کرتی ہو اور ہمیں available ہو regardless of کہ ہم کس function کے اندر ہیں تو ہم global variables ڈیکلیر کر لیتے ہیں it is not a good idea to do that unless it's absolutely necessary idea اس پاستے کہ جی yes convenience تو ہمیں یہ مل گئی کہ یہ variable ہر جگے سے accessible ہیں in convenience یہ ہے کہ جی وہ function جس کا اس variable کے ساتھ کوئی کام بھی نہیں ہے کوئی ذرز نہیں ہے اس میں بھی یہ variables نظر آتے ہیں آپ تپیقلی جیسے میں نے کہا کہ یہ int i اگر ہم نے global بنا دیا ہے اور کسی function میں آپ جاتے ہیں اور بغیر سوچے پہ آپ لکتے ہیں something like a for loop آپ کہتے ہیں for i equal to zero i less than something increment i اور کچھ کام کرتے ہیں یہ i کنسا استعمال ہو رہا ہے یہ i وہی global والا استعمال ہو رہا ہوگا کہیں اور جگے پہ آپ نے اس i کے اندر کوئی valuable value رکھی ہوئی ہے کہ جی ہمارے پاس گاڑیاں کتنی ہے وہ i میں store کی ہوئی ہیں یا کلاس میں students کتنے ہیں وہ ہم نے i میں store کی ہوئے ہیں یہاں پہ loop چلا دی وہ i کی value بدل گئی so global variables have a bad habit of being around even when we don't need them ہاں اگر ہم اس function کے اندر دوبارہ سے int i لکھ دیتے تو پھر ایک local variable function کے اندر create ہو جاتا at runtime اور وہ جو global variable ہے وہ function کے اندر نظر نہ آتا لیکن this can lead to very subtle very hard to track programming errors these are not syntax errors but they are logical errors so beware of using too many global variables اس کی downside یا other side کیا ہے other side یہ ہے کہ جب بھی ہم functions call کرتے ہیں اور اگر ہم چاہیں کہ جی function میں کوئی value pass ہو رہی ہو واپس آ رہی ہو etc اور بار بار وہی i ہمیں function کو pass کرنا پڑھ رہا ہو تو it is inconvenient تو we can make it global and say کہ یہ اویلبل ہے pass کرنے کی ضرورت نہیں ہے pass وہ چیز کریں جو function کے لیے relevant ہے so we can look at global variables from two perspectives now we come to the next variety of variables اب variables جو main کے اندر دیکلیر کیا جاتے ہیں they are local to the function main which means وہ main کے اندر جس مرضی حصے میں آپ operate کر رہے ہیں وہ accessible ہیں values assign کریں ان کو computation کے اندر استعمال کریں اور یا ان کی values display کریں لیکن جب ہم main سے ہٹکہ کسی function میں چلے جاتے ہیں تو main کے variables اس function میں نظر نہیں آتے so they are now hidden function کے اندر کیا نظر آتا ہے یا global variables نظر آتے ہیں یا function کے اپنے variables نظر آتے ہیں جو function کے اندر دیکلیر کیا ہوئے ہیں یا function کو اگر کوئی parameters pass کیا گئے ہیں وہ نظر آتے ہیں وہ نظر آتے ہیں parameters آپ کو یاد ہوگا ہم stack سے pass کرتے ہیں stack پے لکھتیہ function کو call کیا اس نے stack پڑھلی آپ نے لیے temporary copy بنالی variables کی ان کو استعمال کر لیا جو function کے اندر variables ڈیکلیر ہوتے ہیں اور استعمال ہوتے ہیں وہ automatic variables کہلاتے ہیں یہ نیدے automatically come into being جب وہ function call ہوتا ہے اور جب function ختم ہوتا ہے تو automatic variables ختم ہو جاتے ہیں they don't exist anymore so constantly automatic variables are being created and destroyed all the time اب میں جہاں variable کہا رہا ہوں آپ اس کو interpret کریں I'm also using the term for user defined variables which means objects of our classes ان کا behavior بالکل یہی ہے so they are automatic جب function call ہوا ان کے لیے memory allocate ہوئی اسی وقت کہاں پے stack کے اوپر normally اور وہاں سے استعمال ہوکے جب وہ function exit ہوا تو وہ variables destroy ہو گئے what happens اگر ہم چاہیں کہ جب function سے ہم واپس آئیں تو جو function میں کوئی value calculate ہوئی تھی وہ کسی طرح سے یاد رہے لیکن یاد صرف function کو ہی رہے باقی program کو نظر نہ آئے let's step out into the real world بلکہ real world میں ایک fantasy world میں چلتے ہیں ایک تو تھوڑسا light hearted بات کرتے چلیں کہ جیسے fridge کا دروازہ ہوتا ہے اس کو جب ہم کھولتے ہیں تو normally light جلری ہوتی ہے چیزیں نظر آ رہی ہوتی ہیں جب دروازہ بند کرتے ہیں تو light off ہو گئی اور do we know کہ light off ہو گئی کیونکہ جب بھی دروازہ کھولتے ہیں light on ہوتی ہے so when we close the door what is inside the fridge we can't see it we don't know maybe things magically disappear جب دروازہ کھولے تو magically وہ چیزیں وہی پر پڑی ہو you can think of this like a function function میں جب جاتے ہیں تو these automatic variables سارے وہاں پڑے ہوتے اور نظر آ جاتے ہیں لیکن function سے جب وہاں راتے ہیں تو it's like we close the door and the light is turned off we can't see anything function اس میں ایک step آگے بھی جاتا ہے actually it destroys all the local variables لیکن fridge میں ہمیں پتا ہے کہ چیزیں پڑی رہتی ہیں so somehow we want the function to behave like that outside the fridge وہ چیزیں نہیں ہیں ہم ان کو access نہیں کر سکتے لیکن سمجھیں آپ نے کھولا اس میں ایک پانی کی بطل پڑی ہوئی ہے اس کو آپ نے ایک خاص جگہ پے place کر دیا دروازہ بن کیا next time جب آپ دروازہ کھولیں گے تو وہی پہ پڑی ہوئی ملے گی جہاں پہ آپ نے move کر کے اس کو رکھا ہے it won't have move back to some other position if you think of automatic variables ہم کہتے ہیں function کے اندر ہم کہتے ہیں int i اور کہتے ہیں i equal to zero every time you go into the function when you function call ہوتی ہے you find کہی i is created and i always has the value zero to start with اس کے بعد جو مرزی ہم کرتے رہیں ہم چاہے رہیں کہ جب بھی ہم function کے اندر واپس جائیں لیکن ایک دفعہ تو ہم گئے فریج کی طرح ہم نے اٹھایا اور بوٹل ایک جگہ پے رکھی اور دروازہ بند کر دیا so we've made one function call next time we go there when we go back into the function we want that bottle to be found in its new place in other words اگر جیسے ہم نے کوئی دیفائن کیا اور وہ function کے اندر اس کی value 10 سیٹ کر دی کسی وجہ سے اور ہم function سے واپس آگئے ہم چاہتے ہیں کہ next time ہم function میں جائیں تو ہمیں value 10 ملے نہ کہ وہی zero value جہاں سے function شروع ہوا تھا we want somehow to maintain the state of a variable اس کی پچھلی history ہم maintain کرنا چاہتے ہیں جہاں سے میں نے discussion شروع کی تھی اس کو آپ recap کریں لیکن اس کا نقصان بھی میں نے آپ کو بتا دیا that variable happens to exist even when we don't want it to exist static keyword جو ہے it allows us a mechanism for getting away from the downside of the global variables and yet maintaining a state in such a way it allows us a mechanism for getting away from the downside of the global variables and yet maintaining a state in such a way and yet maintaining a state inside a function so that every time when we visit we find out کیجی پیچھے اس کی values کیا تھی اور اب ان values کے لے کہ ہم آگے چلیں اس کے لیے ہم کرتے کیا ہیں جب بھی آپ نے variable function کے اندر declare کرنا ہے تو اس سے پہلے ہم static keyword لکھ دیتے ہیں so we write static int i that declare i to be a static integer inside the function تھوڑا ساگر تھوڑا ساگر سوچیں اس کے اوپر کیجی main کے اندر static define کرنا چاہی ہے تو کیا ہوگا well main itself is a function so یہ illegal تو نہیں ہے کیجی main کے اندر آپ static integer or static variable کسی قسم کا بھی define کر لیں لیکن اس کا کوئی مقصد نہیں ہے because main is the program جہاں سے ہمارے c or c++ کے program شروع ہوتے ہیں اور وہ function ایک دفعہ چلتا ہے اس کی تو state is exactly like state is a variable which is declared inside main یہ صرف called function اس کے لیے relevant ہے discussion so function کے اندر ہم نے کہا دیا static int i کوشش ہم یہ کر رہے ہیں کہ یہ i جو ہے یہ ایک دفعہ initialize ہو جائیں initialize تو ہو جانا چاہی ہے اس کو جب ہم اس کو create کرتے ہیں یعنی یہ create ایک دفعہ ہو پیدا ایک دفعہ ہو لیکن اس کے بعد اس کی value کیا function اس value کو یاد رکھے کیا اس کی کیا value تھی function سے ہم بہر آگیں واپس آئے ہیں تو وہی value ملے static variables کے لیے یہ لازمی ہو جاتا ہے کہ جب وہ create ہوں ان کو اسی وقت initialize کر دیا جائے یہ initialization پورے program کی زندگی کے اندر صرف ایک مرتبہ ہوگی they will be initialized only once now here we have to take care of the total difference difference یہ ہے ابھی تک میں بات کرتا ہے کہ جب ہم int i لکھتے ہیں تو اس کو initialize کر لیں تاکہ آپ کو پتہ ہو اس کی value کیا ہے اور پھر اس کو استمال کریں لیکن وہاں پہ میں اس چیز پہ ذور نہیں دیتا تھا and I left it as a style issue کہ آپ لکھیں int i semi column اور پھر دوسی لین پہ آپ لکھیں i equal to zero اگر zero سے اس کو initialize کرنا ہے لیکن ہم ایک مرتبہ ہوگا جیسے ہی اس کے لیے جگہ بنیگی میں اسی وقت اس میں کوئی value لکھی جائے گی this is initialization اب اگر کوئی لین آتی ہے جس پہ لکھا ہے i equal to zero that will not be treated as initialization it will be treated as an ordinary assignment statement پہلے جب ہم بہن ہم بہن جو ہم بہن ایک مرتبہ ہوگا ایک مرتبہ ہوگا پہلے جب ہم بات کرتے تھے تو یہ کہتے تھے کہ انٹیجر ویڈیوبل کو initialize کر لیا we were actually only using an ordinary assignment یہاں پہ ہم چاہتے ہیں جیسے ہی ویڈیوبل اسی وقت اس میں کوئی value لکھی جائے وہ initialization ہوگے یہ دوبارہ نہیں ہوگی not in the lifetime of that program initialization will happen only once however we can manipulate that variable many times as we want we can increment it we can decrement it لیکن وہ اپنی last value یاد رکھے گا now how does this magic work the way this magic works is کہ ابھی تک ہم stack کی بات کرتے رہے ہیں پھر ہم نے freestore کی بات کی ہے جب ہم see discuss کرے تھے تو ہم اس کو heap کہتے تھے پھر اس کو ہم نے freestore کی نام دے دیا جب ہم نے c++ کی new or delete operators کی بات کی میمری کا ایک اور حصہ بھی ہے وہ اس قسم کے static variables کی لئے reserved ہے stack پہ automatic variables are being created and destroyed all the time heap جو ہے یا freestore جو ہے وہ علاقہ ہے جہاں پہ unused memory پڑی ہوئی ہے جب ہمیں میمری کی ضرورت ہو ہم وہاں سے لے لیں جب ہمیں ضرورت نہیں ہے وہاں واپس دال نہیں یہ اب ایک تیسرہ حصہ ہے static memory area جس میں تمام static variables are created and then they exist for the rest of the program once created they exist جب program ختم ہوگا اس وقت وہ destroy ہوگے so they are different from automatic variables جو normally stack پہ کریٹ ہو رہے ہیں and they are different from dynamically allocated memory جو کہ freestore سے obtain کی جا رہی ہے now to prove this whole point let us try to write a very simple program and make sure that you understand how it works ایک چھوٹا سا فنکشن لکھیں جس کے اندر آپ کہیں کیسی static int i equal to zero so we are declaring i as a static integer and initializing it to zero اور پھر اس کے بعد آپ کہیں i++ بس اتنا سا فنکشن ہے so it just increments the value of i the i which is a local static variable inside f اب اس کے ساتھ ایک main program لکھیں جس کے اندر ایک loop چلائے اور اس function کو call کریں اور اس کی بلکہ function کے اندر ہمیں ایک اور بھی چیز چاہیے کہ ایک i کی value جو ہے وہ print بھی ہو جائے so you can add a c out statement saying something like c out less than less than inside function f value of i is colon پھر less than less than i main کے اندر loop لگائیں جو کہ bar bar f کو call کریں let's say دس دفعہ call کریں what you will notice is جب بھی آپ f میں جائیں گے تو i کی value وہ print کرے گا i کی value آپ دیکھیں گے وہ one two three four اس طرح سے چلتی ہوئی دس تک print ہوگی اسی f میں سے صرف static کا لفس نکال دیں اور یہی main پھر سے چلائیں تو آپ کو پتہ چلے گا ہر دفعہ one print ہو رہا ہوگا one کیوں اب وہاں پر لکھا ہوگا int i equal to zero تو eye create ہوا اسے value ڈیوinkleہ جہہ گی zero پہ next line said eye plus plus increments ہوگی zero میں ایک increment کیا اس کی value one ہوگی see out نے اس کی value print کر دی جیسے ہی functions سے نکلے eye destroy ہوگیا next time function call ہوا پھر سے eye create ہوا پھر سے اس کی value zero ہوئی پھر سے increment ہوئی پھر output کیا one کی value output ہوگئی add the static key word what happens is کہ the creation and the initialization جو جو پاہتہ کے سیکیورد کو بلاپ کی نامی ہے، ملکوں میں پاہ کر دیگا ہے کہ ہونکی جاتا ہے کہ ہم جو کلاسیز بناتے ہیں، Row n کے آب Modernی نامی جاتے ہیں۔ جانتے ہیں کہ ہمیں جگہ بھی جانتے ہیں۔ ہمیں نامی کی بھی کلے ہیں۔ یہ سب کانگ لگی۔ جسی چیوردی یہ خص بھائی ہے کہ北 مرکمی بھائی ہے تو ہمیں جو شہب کاری۔ جو کال بھی چیوردی ہیں کہ ہمینی کال بھی چیوردی ہے تو بیکرے ساکتی ہے ہمیں اوپavaوٹش attitudes کیا تو ہم نے کہا جہاں��کلر ہوا ویٹو اس کو اینشلیز کر دہا ہم نے zero سے اینشلیز کر دیا لیکن آپ جیک کی اینشلائیزیی سین کیا ہوتی ہے کہ ایک کلاس امیییی ڈی فائن کی اونٹ کا آپ جیک کیا تینی بھی انسٹ انشیینٹ اڈ اونٹ اور بہت ایک اپ دیجان بای سیانج سامیہیں بہت رک آئیی کہا اوٹریک بی ویٹریک یا بے ایک کل وہ کلاس ہے جو ہم نے ڈیفائن کی ہوئی ہے اور پھر ای بی جو ہیں وہ اس کے اوپجیکس ہیں جو کے مین یا کسی فنکشن کے اندر کریٹ ہو رہے ہیں تو ان کی انشالیزیشن کب ہوتی ہے انشالیزیشن اب تک آپ کو پتا ہوگا وہ کنسٹرکٹر میں کی جاتی ہے سو نواملی سی پلس پلس تو آپ کو ایک دیفولٹ کنسٹرکٹر دے رہا ہے ان کلاس اس کے لیے یہاں پے ہمیں اپنے کنسٹرکٹر کو کس لکنے پڑتے ہیں کیونکہ ہم نے کہا ہے کہ جی انشالیزیشن اوپجیک can only happen once if it is declared static اب again پوری ڈیبیٹ یا آگومنٹ جو ہے بالکل وہی ہے جو کہ static ordinary ڈیٹر تیپ کی ابھی میں نے بات کی کہ ہم مین کے اندر بات نہیں کر رہے ہم کہہیں کسی فنکشن کے اندر اگر کوئی ہم static object ڈیکلیر کرنا چاہیں یعنی the object exists even when we are outside the function it is not accessible اس کو ہم ہاتھ نہیں لگا سکتے اس وقت وہ فریج کا دروازہ بند ہے لیکن جب بھی کھولیں وہ object ہمیں اپنی original state کی اندر نظر آئے جب بھی ہم static object ڈیکلیٹ کرنا چاہتے ہیں تو اس کو initialize کرنا بھی لازمی ہے اگر آپ anything other than default initialization کرنا چاہتے ہیں which is like 99.9% of the time آپ چاہیں گے کہ جب بھی آپ کی کسی کلاس کا object create ہو تو اس کے data members میں کوئی values کسی ترتیب کے تحت place ہو جائیں that is the initialization of the object if we want that to happen we must provide a constructor جو کے arguments لے اور وہ جب بھی object create ہو اس کی values یا اس کے data members کو initialize کر دائے only then will it work otherwise we'll have a problem now sometimes we do want to do something like truck a اب یہاں پہ اگر constructor defined ہے جو کہ arguments لیتا ہے تو پھر ایک اس قسم کا truck بیادہ ہوگا یعنی what type of object will be created اس کے پئیے کتنے ہوں گی اس کی seatیں کتنے ہوں گی اس کے لیے بھی ہمارے پاس technique ہے constructor define کریں جو کہ arguments تو لے لیکن ان arguments کی default values بھی آپ Provide کر دیں if you remember if you Provided a constructor with default values in the constructor list پرانتیسیز کی اندر تو وہ object جو create ہوتا ہے وہ automatically اس کو default values مل جاتی ہیں ہاں اگر آپ کہیں truck a پرانتیسیز 4 کمہ 6 تو مبھی ہم نے constructor اس طرح کا لکھا ہوئے کہ اس کے چار پئیے ہوں گے اور چھے seatیں ہوں گی یہ چیزیں اس کے اندر جاکے initialize کر دیں گی but the point to remember is if you are ever going to use static objects then you should provide a constructor and you should provide a constructor with default arguments so that the object that you create is initialized properly other than that the whole behavior of a static object is exactly the same as an ordinary data type a native data type like int float char double اگر اس کہام ایک static variable create کر دیں again the idea is کہی a static variable means maintaining the state of a variable it exists and it lives around even when we are outside the function and it is an alternative to using a global جس کی down side میں بار بار بتایا آپ کو it exists even when we don't want it now okay so we've talked about the constructor what about the destructor of these objects if they are static when will it be called normally اگر آپ فنکشن کے اندر ایک object create کرتے ہیں so آپ فنکشن کے اندر ordinary آپ نے لکھ دیا truck a جب وہ فنکشن ختم ہوگا تو a will be destroyed you need the destructor for this static object will be called آپ نے اگر اس کو پروف کرنا ہے تو بڑا سیمپل ہے آپ ایک اپنی چھوٹی سی کلاس لکھیں اس کے constructor کے اندر آپ see out کے ساتھ دسپلے کر دیں inside constructor کوئی نام بھی دے دیں تھا کہ آپ کو پتا چاہتا ہے کونسا والا object ہے maybe you can use that as an initializer اس کے destructor کے اندر آپ لکھیں see out inside the destructor for object اور پھر اس کا نام جو بھی آپ initializer سے آپ لے رہے ہیں وہاں پے data member اب ایک experiment ڈران کریں سب سے پہلے آپ ایک global object اس کا define کر دیں so truck پہ رہتے ہم کہتے ہیں outside of main ہم نے کہا دیا truck a اس کے initializer کے طور پہ ہم کوئی single character pass کر دیتے ہیں کہ جی اس کے اندر ایک data member ہم نے define کر دیا 4 name اور name کے اندر یہ character چلا جائے گا تھا کہ ہم can identify کر سکیں کونسا object ہے so we say truck a within parenthesis single quotation marks میں کہ یہاں پہیں a single character جا رہے اس میںligتے ہیں ذہب بشہہ capital a لکھتے constructر میں آپ کہیں see out inside less than less than inside constructor for object اور جو اس کا آپ نے initializer pass کی ہے name in this case آپ اپنیم کو اوٹپوٹ کر آ لیں تو یہ سکرین کے اوپر لائنگ پرنٹ ہوگی کنسٹرکٹی یا انسائیڈ کنسٹرکٹر for object capital A تاکہ آپ کو پتہ چل جائے کنسا object ڈیٹ ہو رہا ہے سو now we write one global we say truck A or within parenthesis we put in capital A then within main define an ordinary variable you say truck B اور اس کو within parenthesis آپ اس کو نام دے دیں B کا اس کا بھی constructor call ہوگا آپ کو نظر آئے گا ایک چھوٹا سا function بنالیں جس کے اندر ایک object create کریں سو we say truck C اور اس کا نام C دے دیں by passing an argument to the constructor then define yet another function سو پہلے function کو f کہ دیں دوسرے کو g کہ دیں اس کے اندر آپ کہیں static truck D اور D کو بھی آپ ایک نام دے دیں D main کے اندر ایک آپ نے local main کے اندر truck define کیا اس کے بعد f کو call کریں اس کے بعد g کو call کریں اور ختم main کا کام ختم اس پرگم کو کمپائل کریں اور چلایں دیکھیں آپ چونکہ constructor اور destructor کے اندر ہم نے یہ see out statement کے ساتھ بتا دیا ہے کہ کنسا والا object پیدا ہو رہا ہے کنسا والا object مر رہا ہے یعنی which object is being created which object is being destroyed you should be able to track things what will happen is سب سے پہلے global object will be created so you'll find کہ جی a کی output لائنہ آگئی ہے inside constructor for object a اس کے بعد آپ main کے اندر آئیں گے تو object b create ہو رہا ہو گا because that's a local variable a local object for main تو آپ کے پاس اس کی constructor لائنہ آ جائے گی کہ جی b create ہو گیا اس کے بعد آپ نے function f call کیا اور یاد رہے کہ function f وہ اپنی لیے ایک local truck object c create کر رہا ہے اس کا constructor call ہو گا اور آجائے گا inside constructor for object c اس کے بعد کیا ہو گا function f ختم ہو گا you'll go back to main اگر function f ختم ہو گا تو f کا جو local data local variable in this case truck that will be destroyed وہ truck تھا truck c you will find out کہ اس کا destructor call ہو گا you will find out کہ screen کیوں پر لکھا با آگئے inside destructor for object c for truck c جو بھی آپ نے لکھا ہو گا اس کے بعد ہم g کو call کرتے ہیں g کو اگر call کیا تو آجائے گا inside constructor for object d لیکن یاد رہے g function جو ہے اس کے اندر ہم نے static object create کیا ہے اب جب g exit ہوگا تو اس کا destructor کی لائن لیکن انظر نہیں آئے گی so you will not see a destructor لائن اب مین کے اندر بیشا کے ایک output لائن دال دیں یہاں پہ کہ g function has been called کہ آپ کو پتا چل جا وابس مین میں آگئے ہیں اس کے بعد مین ختم ہوتا ہے اب جو مین ختم ہوگا تو اب destructors call ہونے شروع ہو گے کن object کے a جو global تھا اس کا call ہونا ہے b جو main کے اندر declare کیا تھا اس کا destructor call ہو گا d جو g کے اندر create ہوگا اس کا destructor call ہوگا کس طرح تیب میں call ہون گے جس طرح تیب میں objects create کیا گئے تھے اس کی reverse order کے اندر the destructors will be called so if you look at this very simple program you find کہ جی the last object to be created was the static object inside the function g should that be deleted first اس کا destructor call ہوگا think about it well actually not true سب سے پہلے جو destructor call ہوگا وہ main کے local variable کا call ہوگا کیونکہ ایک اسم کا main function end ہو رہا ہے تو local variables سب سے پہلے destroy ہون گے static objects remain for a longer period of time so the next object to be destroyed will be the static object called d which was created inside the function g and finally the thing that will be destroyed will be the global object جو اس پروگرہ میں داخل ہوتے بے سب سے پہلے create کیا گیا تھا so now you will find the destructor for object a being called please do this exercise because it is enlightening آپ کو پتا چال جاتا ہے کہ کس sequence میں چیزیں call ہو رہی ہیں اور ایک اور چیز یہ exercise prove کرتی ہے کہ اگر static object کسی function کے اندر create کیا جائے تو جب وہ function سے آپ واپس آتے ہیں تو وہ object مر نہیں جاتا it still exists اور پھر آپ object میں یا function میں جائیں گے in this case g function اگر call کریں گے تو وہ object وہی پی آپ کو ملے گا اور اس کی values وہی ہونگی جو آپ چھوڑ کے وہاں پے گئے تھے so you can use them just to recap جب ہم کسی بھی function کے اندر کوئی بھی static variable create کرتے ہیں اور variable now I am using in the generic sense of the term it can be a native type or it can be an object of one of our own classes whenever we create a static variable inside a function that variable is created and initialized only once during the lifetime of the program and it is destroyed or taken out of memory only once during the lifetime of the program so it is a good way of maintaining state دوسرے point جو ہم نے دسکس کیے it is an alternative to using a global data type جس کے side effects ہیں تیسری چیز main کے اندر static variables لکھے ضرور جا سکتے ہیں لیکن it is a meaningless exercise they are exactly like ordinary variables inside main now let's move on and extend this concept to inside a class ہم نے باچے کی ہے کہ these static variables are used to maintain state اب state کی جہاں بات کر رہے کہ یہ حالت کیا تھی تیک ہے اس حالت کو سیف کر لیا جا ہے تاکہ واپس آئیں تو وہی حالت ہمیں ملے جس چیز کی بھی بات ہو رہی ہے جب ہم static variables کی بات کر رہے تھے تو ہم program کی state کی بات کر رہے تھے so we went back into a function we found the function in the same state as we had left it now I want to extend the concept and I want to go inside an object and I say when I go inside an object certain things left exactly the way they were initially so now we are talking of static data members inside a class what do we mean by a static data member defined inside a class دو تین چیزیں اس میں غور کرنے والی ہیں static means کہ that thing will be stationary for what for an object or for the class the idea here is it will be static for the class that means اس کلاس کے لیے وہ دیتا ایک دفعہ create ہوگا ایک دفعہ initialize ہوگا لہذا اس کا objects جو کریں گے اس کلاس کے ان کے ساتھ تعلق نہیں ہے اس چیز کو آپ کلیرلی سمجھ لیں there is only one copy of the static data member inside a class the copy is not repeated for the objects جب بھی ہم object کسی کلاس کا create کرتے ہیں وہ کلاس کا پورا data structure object کیلیے create ہو رہا ہے یہ ہم نے پہلے بھی بات کی ہے اور اس کے کلاس کے functions کی ایک copy لکھ دی جاتی ہے کہیں پے تا کہ جب object کوئی function call کرے تو اس copy میں سے وہ object کام کر سکے یا function operate کر سکے static data member وہ پوری class کیلیے ایک member جانرہا ہے پر بتا کسی ا choice掉نی بہت اگر mention dreaming جانرہا ہے انگی میں ہم کی ہےavo other some its mic i buildสال aufge concert it 4 werd still everything came to any because offered zap Compressed lameunk because it has حدیث سب سے بہت으نہ دیکھتا ہوں کہ ہم ایک مماریاں کے محرصہ کی طرف ہوتا ہے۔ بہتو ہی ایک ممارے پہنچ دیتے ہیں اگر آپ کسی حطر ترام کی تأحیقت میں مماریاںOSTATICِ دیتا ہے۔ انہوں کی جو ایک ممارے پہنچ میں آپ کسی حطر تک دیتے ہیں، اگر مماری پہنچ دیتے ہیں، اس کے ممارے پہنچ کو طورتے ہیں۔ ہمارے پاس کچھ ٹیکنیکس ہیں بکوز we don't know میمری تو علوکہت ہوگی اس میں value کیا گئی تو we have to be able to initialize them we initialize it only once in the program the initialization is done at file scope which means almost at the global scope جب آپ مین سے بھی بہر بیٹھ کے آپ اس کو انشلائس کریں گے مین سے بہر ہم کیوں کر سکتے ہیں کہ جی کلاس ہے اس کا سٹیٹک ڈیٹا میمبرز ڈیٹ ہو گئے ہیں ان کی جگہ ڈیٹ ہو گئی ہے ان کی دوسری کوپی نہیں بننی کسی ڈیٹ کے لیے لہذا ان کو انشلائس کیا جا سکتا ہے ابجیکٹ نہیں ہے کلاس کے ڈیٹا میمبر کو ہم انشلائس کیسے کریں یاد رہے کہ جب بھی ہمارے پاس لیت سے truck کوئی کلاس تھی اور اس کے اندر ہمارے پاس ویریبل تھے int, wheels, int seats کتنے پائے ہیں کتنے اس میں سیٹیں لگی ہوئی ہیں تو ان کو آم ڈیٹ کے ساتھ ریفر کرتے تھے کہ اگر کہیں کوئی ڈیٹ کیا ہے مین کے اندر ہم نے کا truck a تو ہم کہتے تھے a.seats that would be the way to refer to a ڈیٹا میمبر اب یہاں پہ میں تھوڑی سی اور بات کر رہا ہوں میں بات کر رہا ہوں کہ جی ایک ڈیٹا میمبر تو ہے وہ کلاس کا حصہ ہے پر وہ سٹیٹیک ہے اور میں نے کہا کہ ابھی ڈیٹ ڈیٹ تھا وہ ہم نے ڈیٹ کیا ہی نہیں ہے تو اس کے لیے میمری بن گئی اب اس میمری کو ہم انشلائز بھی کرنا چاہتے ہیں کیسے کریں we do this by using the scope resolution operator یاد رہے ڈبل کولن دو نکتے ڈو نکتے لگا کے لیکن اس کے left hand ڈیٹ پر ڈیٹ کا نام نہیں آتا بجائے اس کے کلاس کا نام لکھ دیا جاتا ہے لیکن اس کے لئے ڈیٹ کا نام لکھ دیا جاتا ہے اور اس کے لئے ڈیٹ کا نام لکھ دیا جاتا ہے اور اس کے لئے ڈیٹ کا نام لکھ دیا جاتا ہے now this is happening at file scope مین سے بھی باہر and it is happening only once in the program because مین سے باہر ہے یہ دوسی دفعہ تو یہاں نہیں چلے گا it is being initialized at the class کے لیے ایک value initialized ہوگی اب جتنے مرزی objects بنائیں objects اس value کو دیکھ سکتے ہیں پڑھ سکتے ہیں چینج کر سکتے ہیں دیکھیں میں کہیں private public کیا بھی بات نہیں کی this static data member could have been private inside the class the objects of the class have access to it so they can look at it they can manipulate it but it was created and manipulated only once and there is a single copy of this static data member regardless of how many objects of the class you create اس میں کچھ dangers ہیں let's take a look at what those problems are suppose we have a class called savings account ہم سب بینک میں کچھ نا کچھ پیسے رکھتے ہیں ہم نے a saving account ہے PLS account کھولا ہوئے اس پر profit بھی لگتا ہے اور profit کا over a period of time banks وہ ریٹ دیکلیر کرتے ہیں ایک چیز ہے profit rate اور profit rate تمام PLS accounts پے یکسان لگتا ہے ہم کیا کہہ رہے ہیں کہ یہ ہم نے کلاس بنائی اور کلاس ہے savings account اس میں آجائے گا کہ یہ کس کا ایکانٹ ہے ایکانٹ نمبر کیا ہے اس کا current balance کیا ہے لیکن اس کے اندر profit rate بھی بتانا ہوگا تاکہ ہم کہہ سکیں کہ ایکانٹ کو اپڑیٹ کر دو profit لگا دو اس کے اوپر لیکن کیا ہر savings account کا different profit ہوگا the answer is no savings account تو ہے کہ یہ bank نے announced کیا ہے تین فیصد profit ڈیٹرمن ہوئے پسلے quater کا ان تین مہینوں کے لیے ہم تین فیصد profit دے رہے ہیں وہ تمام PLS accounts کو لگا دیا جائے ہم چاہتے ہیں کہ جو profit rate وہ تو ایک جگے پی ڈیفائنٹ ہو کلاس کا حصہ ضرور ہو لیکن ہر آبجیک میں علیدہ علیدہ ڈیفائنٹ نہ ہو لیکن ہر آبجیک میں لیکن ہر آبجیک میں علیدہ علیدہ ڈیفائنٹ نہ ہو میں پیر شاہر ہر آبجیک میں گو اگر ہی افكار ہر آبجیک میں علیدہ علیدہ ڈیفائنٹ نہ ہو اس کی زیادہ دستعمح بیویٹ ایک تین فیصد ایک تین مہین سی ذہگا اور اس کے قاول ہر آبجیک میں علیدہ علیدہ علیدہ ڈیفائنٹ راحت جو پیرہ روح جائے اسی لیکن ہم ہم ایک Chanceできتے ہیں اس لیکن یہ مجھے معامل جاہتے ہیں اس کے لئے فلوٹ کی سپیس الوکیٹ ہو گئی، یہ لائن چلی وہاں پر 3.0 لکھا گیا، ابھی کوئی سیونگز اکاونٹ کریٹ نہیں ہوا۔ مین کے اندر یا کسی فنکچن کے اندر جیسے جیسے ہم سیونگز اکاونٹ کرتے جائیں گے، سیونگ اکاونٹ 1,2,3,A,B,C کسی کا جو بھی اس کی انیشلیزیتن سے وہ کریں گے، ہر ایک کو یہ پروفیٹ ریٹ اوپل ہوگا۔ اس کو ایکسس کرنے جائیں تو اگر ہمارے پاس ہے سیونگز اکاونٹ A، تو آپ کیا سکتی؟ A.PROFIT RATE اگر کوئی بھی کالکلیشن کرنی ہے لیکن خیال رکھے یہ لیگل ہے لیکن it's a bad usage. Why is it a bad usage? Suppose میں کہیں پہ کلاس کے اندر کہتا ہوں A.PROFIT RATE is equal to 4.0 تو کیا A کا پروفیٹ ریٹ بدلا؟ Answer is no. ابھی تک جو میں بات کرتا ہوں کہ یہ پروفیٹ ریٹ تو ایک copy ہے for all objects of this class. That means if an object manipulates the static data member which it can through its member functions or directly depending on whether it's public or private it actually is modifying the value of that static data member for all objects of this class. So don't ever fall into this trap کہ جی میں نے تو profit rate object A کیلئے بدلا ہے اور بی کا پروفیٹ لگانے جائیں تو پتا چاہ لیکن جی نئے ریٹ پہ بی کا پروفیٹ لگیا legal usage ہے لیکن a better usage is always to use the class name as the prefix. So never use something like A dot profit rate جہاں A is an object of the class always use something like savings account dot profit rate. You can do that your savings account colon colon profit rate which means class scope کیو پر آپ اس کو ریزولف کر رہے ہیں Be very careful with this دوسرا ابھی ایک میں نے آپ کو ایک چھوٹا سا example دیا on savings accounts and profit rate کی جی profit rate تو ایک ہی لگے کا سب accounts کو اور کوئی اجامپر think about it this way آپ کی کلاس ہے کلاس میں ہم نے ایک student object کریٹ کیا ہوا ہے student object میں میں ایک فیلڈ رکھ لیتا ہوں کہ جی how many students are there in the class now every time a student enrolls for the course میں چاہتا ہوں کہ number of students increment ہو جائے جب بھی student course نکل جاتا ہے he either withdraws or fails or passes out میں چاہتا ہوں کہ یہ student class کی اندر ہی کام ہو so what we do is we define a static data member in this case انٹ ہوگا کیونکہ you don't have half a student you only have whole students so we define an int static data member let's call it how many and we initialize it to zero so we initialize it by using the class name student colon colon and how many equal to zero we put it in the constructor how many plus plus when you create a student object then how many will be incremented by one and whenever a student goes out of that class it leaves the subject or leaves the course i.e. اس کا destructor call ہوگا then we will do it in the destructor how many minus minus so it's a good way of keeping track how many objects of a particular type exist at this time inside the program to display that آپ کوئی بھی ممبر فنکشن لکھلیں you can say you know display how many as a member function جو see out کے ساتھ بتا دے کہ اس وقت so many students are registered but the nice thing is یہ سارا کام ہم نے کلاس کے اندر سے کر لیا ہم نے دو کلاسے استعمال نہیں کی ہم نے کوئی global variable نہیں استعمال کیا یہ ہم نے اپنہ پر پڑھ پڑھ کے نہیں لکھا کے دی student one, two, three, four, five ہم نے five declare کیوںے تو there are now five students in the course using these members you can make your program more and more dynamic dynamic is a topic that we will be covering now in the next following lectures اور میں چاہوں گا کہ میں تھوڑا سا time جو ہے وہ dynamic classes اور rather classes جن کے اندر dynamic data allocation کی جاتی ہے اس کے بارے میں بات کی جائے لیکن یہ والا usage of static you should understand is very important and very very very useful یعنی just maintaining a state state means حال جو ہے جو کفیت ہے so a state might be how many students are in the class and we are maintaining the state جتنے مرزی کریٹ ہو destroy ہو آپ plus minus کرتے رہیں گے لیکن today we have covered نمبر 1 a slight discussion on manipulators پرمیٹر less manipulators سیمپل تنگs او سٹیم ریفرنس انہوں ریٹرن کرنا ہے او سٹیم ریفرنس ان کو پاس کیا جائے گا and then we've gone on and discussed about static data بوثت at an ordinary level static object level and then static data members inside a class انٹوپکس کو آپ ریویو کر لیں انیشلی یہ زرہ سے off the beaten track ہے زرہ سے side پہ ہے مینسٹیم ہماری programming میں نہیں ہے بہت ان کا use بہت ہے جیسے آپ کے programs کمپلیکسٹی میں انکریز کریں گے as you write bigger and more complex programs you will find that these concepts are very very useful again from a generic perspective realize that you will be working hopefully in your professional career with many different languages you have to understand that every language might represent the static concept in a different way but just knowing کہ یہ ایک concept ہوتا ہے that empowers you to look and understand at more complex programming languages as well till next time خدا حافظ