Transcript for:
OOPS प्रोग्रामिंग के महत्वपूर्ण सिद्धांत

Hi everyone and welcome to Aapna College, राज के अपने one shot के अंदर हम zero से लेके advance तक पूरे के पूरे OOPS को cover करेंगे from interview point of view चाहे आपका placement का interview आ रहा है, चाहे हमारा internship का interview आ रहा है या फिर हम college exams में OOPS के exam की preparation कर रहे हैं सारी की सारी चीजों के लिए ये one shot जो है वो sufficient होने वाला है पर इसको specifically हमने placement and internship interviews के लिए तैयार किया है तो OOPS यानि object oriented programming एक बहुत ही जादा important concept होता है जो majority companies अपने tech interviews के अंदर जिसके सवाल पूछती हैं, तो OOPS की एक strong understanding होना बहुत ज़रूरी है, ताकि हमारे interviews बहुत अच्छे से जाएं, उसके साथ में हमारी understanding of programming भी बहुत ज़्यादा बड़े, क्योंकि companies के अंदर कई जगे जाके हमें OOPS को बहुत बार implement करना होता है, तो इसके concept पहले से जितने strong होंगे, तो आज का जो हमारा one shot है, इसके अंदर हम theory concepts को तो cover करेंगे ही, हम बहुत सारे examples को cover करेंगे, हम काफी सारी important definitions को cover करेंगे, जिनको हमें याद रखना है, क्योंकि वैसे के वैसे वो interviews के अंदर पूछी जाती हैं, और इसके साथ में हम हर एक single concept का code भी लिख कर देख रहे होंगे, तो हर चीज का हमें practical example मिल रहा होगा, कि जिस चीज को हम पढ़ रहे हैं, और साथ में इस पूरे one shot के end पे, हमें 30 MCQ questions मिल रहे होंगे, जिससे हमारी जो भी understanding हमने ली पूरी lecture के दौरान, तो शुरुआत करते हैं अपनी OOPS की जर्नी को Hi everyone और अब हम शुरुआत करने वाले हैं अपनी Object Oriented Programming की जर्नी से अब Object Oriented Programming की जब भी हम बात करते हैं इस lecture के अंदर basically हम अपनी objects की बात करेंगे कि objects exactly C++ के अंदर क्या होती है और objects से related different different concepts का क्या मतलब होता है C++ के अंदर यह chapter एक तो सबसे पहले इसलिए important है क्योंकि interviews में जब भी internship placement के interviews होते हैं for SD position, software engineering position तो वहाँ पर इस से related काफी सारे questions आते हैं, तो इसीलिए इस chapter के अंदर एक तो definitions बहुत जादा important हो जाती हैं, क्योंकि directly interviewer हमसे किसी भी complex term की definition बूच सकते हैं, उसके साथ में examples जितने भी हम discuss करेंगे, वो important हो जाते हैं, क्योंकि कभी भी interviewer हमसे साथ में example भी बूच सकते हैं, Object Oriented Programming basically कोड को ही लिखने का एक और बहतर तरीका है। ऐसा नहीं है कि Object Oriented Programming हमेशा यूज़ करना compulsory होता है। पर generally बहुत सारे real life scenarios ऐसे देखे गए हैं, जिसमें कोड में अगर आप OOPS के concepts को यूज़ करते हैं, तो हमारा कोड और जादा better बन जाता है, especially organization level पे, यानि जब हम companies के अंदर जाकर काम करेंगे। हम बिना OOPS के सारा का सारा logic C++ में implement कर सकते हैं। लेकिन जब हम OOPS को यूज़ करके उसी सेम लॉजिक को implement करते हैं, तो काफी सारे real life scenarios ऐसे होते हैं, जिनको code में represent करना, जिनके लिए C++ का code लिखना बहुत असान हो जाता है, और ये जो line है, ये बहुत important है, क्योंकि इसका मतलब ही हम पूरे lecture के अंदर सीख रहे होंगे, कि कै या string library को use किया है, या हमने stack library को use किया है, तो ये सारी की सारी library, C++ के STL के अंदर exist करती है, because of OOPS, क्योंकि इन सब को implement करने के लिए, internally OOPS के concept को use किया जाता है, तो हम भी अपनी बहुत सारी classes create करने वाले हैं, और बहुत सारी OOPS के concept सीखने वाले हैं, अब OOPS के concept सीखने से पहले, दो important terms हैं, एक होती है हमारी class, और एक होती है हमारी object, object क्या होती है, real world के अंदर सारी कोई भी आप entity उठा ले, entity यानि कोई भी अगर हम चीज उठा ले, तो हम उसे object कह सकते हैं, यह pen एक object है, मेरा laptop एक object है, यह हमारा phone एक object होता है, तो जितनी भी हमारी real world की entities होती हैं, किसी भी चीज को हम object कह देते हैं, और इन ही entities को जब हम C++ के code के अंदर convert करना चाते हैं, तो वहाँ पर C++ के code के अंदर भी इन्हें हम objects ही बना देते हैं, और class क्या होती है, class is basically like a blueprint of these objects, blueprint का काम होता है ये बताना कि object कैसी दिखेगी, इसके लिए एक बहुत basic सा example लेते है, for example Toyota ने क्या किया, एक factory setup की, तो Toyota ने internally अपनी factory के अंदर एक blueprint बनाया होगा कि उनकी सारी गाड़ियां कैसी दिखनी चाहिए, तो टोयोटा क्या करता है, इस blueprint को देखता है, अपनी car 1 बना देता है, फिर दुबारा blueprint को देखता है, अपनी car 2 बना देता है, फिर दुबारा blueprint को देखता है, अपनी car 3 बना देता है, तो इस तरीके से टोयोटा अब unlimited गाड़ियां बना सकता है, तो इस case के अंदर, ये जो cars ह आता है कि ये object कैसी दिखनी चाहिए, ये object कैसी दिखनी चाहिए, इस blueprint को हम class कह देते हैं, तो class can also be a blueprint for objects, it can also be a group of objects, इसको हम group of objects की तरह भी imagine कर सकते हैं, जैसे हमारे school के अंदर, college के अंदर हम सारे students एकी class के अंदर बैठते हैं, तो वो class क्या हो गई, वो class हमारे सारे students का group हो हमारे college के अंदर, हमारा college का पूरा एक system exist करता होगा, जिसमें हर एक teacher का अपना एक account बना होगा, यानि जितने भी teachers college के अंदर काम करते हैं, उन सबकी information college के system में store होती होगी, तो हमें भी बोला जाता है, कि हमें C++ को use करके ऐसा system design करना है अपने college के लिए, जो सारे के सारे teachers की information एक तो teacher के लिए हर एक teacher का हम name store करा सकते हैं, उसके साथ में हम हर एक teacher का जो department है वो store करा सकते हैं, हर एक teacher का जो subject है उसे store करा सकते हैं, हर एक teacher की जो salary है हम उसे store करा सकते हैं, तो ये सारी चीज़ें क्या हो गई, तो ये सारी चीज़ें हो गई कुछ properties, इने हम technical भाषा में properties कह जिस entity की अपने आप में कुछ न कुछ properties होंगी कि भाई code में अगर हमें teacher की information store करवानी है तो उसके साथ में ये extra info भी हमें store करानी पड़ेगी और साथ में teachers के कुछ-कुछ extra functions भी होंगे जैसे क्या-क्या functions होंगे हो सकता है किसी teacher के लिए हमारे पास एक function हो change कर दो teacher का department कि teacher अगर let's suppose mechanical department से civil department के अंदर shift होते हैं तो change department एक ऐसा function है जो इन teacher के साथ associated होना चाहिए ताकि कोई भी जाकर system के अंदर teacher का department change कर सके, उसके साथ में हो सकता है salary के लिए tax calculate करना है, कुछ और different different और भी functions हो सकते हैं teacher से associated, पर एक basic function हमने ले लिया, तो teacher क्या बन गया, teacher इस case में क्योंकि हमारी एक real world entity है, तो teacher को तो हम बनाएंगे एक तरीके से अपना object, और हर object के साथ हमारी different different properties associated होती हैं, और हमारे कुछ functions associated होते हैं, जिनको technical भाषा में हम अपने method कहते हैं, method is nothing but a function which is written inside a class, class या objects के लिए जो हम अपने functions बनाते हैं, उन्हीं को basically हम अपने method कह देते हैं, अब वैसे तो normally अगर हमें एक teacher की information store करनी होती, C++ code के अंदर, उसके लिए हम एक string बना लेते हैं, कि भाई हमें अपनी teacher कोई T1 है, उसका name store करना है, तो ये string T1 name हो गई, उसके बाद हम एक और string बना लेते हैं कि हमें अपनी teacher T1 के लिए उनका department store करना है, और इसी तरीके से फिर कोई दूसरी teacher आती, तो हमें दुबारा लिखना पड़ता string T2 का हमें name store करना है, और हमें string T2 का department store करना है, तो इस तरीके से अगर हमारे system के अंदर let's suppose 50 teachers हैं, तो उन स� तो उस logic को हम दुबारा क्यों लिखें, ये तो bad programming है, तो इसी bad programming से बचने के लिए हम oops का concept use करते हैं, कि एक बार class बना दो, एक बार blueprint बन गया न, यानि एक बार factory ने blueprint बता दिया, तो उसके बार Toyota क्या करेगा, गाडिया एक के बाद एक के बाद एक same format के उपर manufacture करेगा, तो वैसे हमें एक बार अपने C++ कोड में बताना है कि teacher के पास क्या क्या properties होंगी, और क्या क्या methods होंगे, और हम फिर बहुत सारी different different teachers की profiles अपने लिए create कर सकते हैं, तो instead of creating a lot of variables in our C++ code, OOPS का concept या classes और objects का concept क्या कहता है? यह concept हमें कहता है कि आप एक class बना लो, class मतलब आप एक blueprint लिख लो कि एक teacher कैसा दिखना चाहिए, उसके बाद आप class की object 1 बना लो, मतलब teacher 1, class की object 2 बना लो, मतलब teacher 2, class के object 3 हम create कर लेंगे teacher 3, तो अब आपको चाहे 50 teachers चाहे, आपको चाहे 100 teachers चाहे, आपको चाहे 1 lakh teachers चाहे, अब आपको बार-बार code repeat नहीं करना पड़ेगा, code के अंदर reusability आ जाएगी, क्योंकि इसी same class को, जो blueprint है, उसी को use करके हम सारी objects को जाकर अब create कर सकते हैं, अब objects and classes का जो concept है, ये सिर्फ C++ के अंदर exist नहीं करता, ये java जैसी languages के अंदर भी exist करता है, या अगर हम python कर रहे हैं, javascript कर रहे हैं, दूसरी कोई language कर रहे हैं, तो वहाँ पे भी generally ये concept जो है, वो exist करता है, और अगर आप company में जाकर काम करेंगे, तो वहाँ पे तो oops काफी जादा use होती है हमारी day-to-day programming के अंदर. अब जब भी हम oops की बात करते हैं, एक और practical example ले लेते हैं. For example, Amazon है. Amazon ने अपनी पूरी website बनाई हुई है अब Amazon की website पे हर एक जो product list होता है हर product के अंदर कुछ ना कुछ common चीज़े हैं हर product का अपना एक नाम है हर product का अपना एक price है हर product का अपना एक description है हर product के लिए हो सकता है कि कुछ discount amount हो कि इस पे 5% discount चल रहा है, 10% चल रहा है, 0% चल रहा है तो ये तो हो गया Amazon पे product 1 उसी तरीके से हम एक और product बना सकते हैं ये हो गया Amazon का product 2 जिसमें name, price, description, discount चारो चीजें होंगी, ये हो गया Amazon का product tree, इसमें भी name, price, description, discount चारो चीजें होंगी, तो ये जो Amazon के different different products हैं, internally Amazon ने भी हो सकता है, हो सकता है क्या most probably, इनको objects की तरह ही implement किया होगा, मतलब वहाँ पे classes and objects का ही logic use हुआ होगा, तो जहाँ पर भी code के अंदर हमें ऐसी entities create करनी पड़े, जिसमें हमें काफी सारी properties और काफी सारी methods create करने हैं, वहाँ पे हम classes and objects को use करेंगे, अब class और object को use करने के लिए सबसे पहले हम एक class को declare करना पड़ता है, class को declare करने के लिए हम अपना class keyword लिखते हैं, और फिर अपनी class का नाम लिखते हैं, generally हम जिस भी अपनी entity के लिए class बनाना जाते हैं, for example हमें teachers को create करने के लिए class बनानी है, teachers का और इस तरीके से फिर हम अपनी class को create कर लेते हैं, तो एक general syntax होता है code के अंदर हमारी class को लिखने का, इसी के अंदर हम अपनी properties लिखते हैं, और इसी के अंदर हम अपने methods को लिख रहे होते हैं, तो एक बार एक teacher class को create करते हैं, we have created this oops.cpp file, इसके अंदर हमने iostream header file include की है, साथ तो class हमारा keyword हो गया class का नाम होने वाला है teacher इस तरीके से curly braces लगाएंगे और हमेशा class के end में एक semicolon लगता है जिससे पता चलता है हमारी class यहाँ पर end कर रही है अब इस class के अंदर हम सबसे पहले तो वो सारी properties बताते हैं जो class के अंदर होनी चाहिए फिर हम सारे methods बताते हैं मतलब teacher की जब हम object बनाएंगे तो object के पास कौन-कौन सी qualities होनी चाहिए कौन-कौन सी values होनी चाहिए एक तो teacher का name होना चाहिए name किस type का होगा string type का तो teacher के पास एक string name होनी चाहिए teacher के पास एक string department होना चाहिए teacher के पास एक string subject होना चाहिए साथ के साथ teacher की कुछ salary होनी चाहिए तो float करके हम अपनी salary लिख सकते हैं या float की जगे इसे हम double बना लेते हैं teacher से related कुछ-कुछ हमारी properties हो गई इनही properties को technical भाषा में या तो हम properties कह देते हैं या इन्हें हम attributes भी कह देते हैं तो जहां भी आप attribute शब्द सुने, जहां भी आप property शब्द सुने, उसका मतलब है कि हम इन सारी values की बात कर रहे हैं, उसके अलावा हमारे पास teacher से related कुछ-कुछ methods भी होते हैं, let us minimize this, teacher से related methods में क्या-क्या methods हो सकते हैं, हमने एक method discuss किया है, method यानि function ही आपको बस लिखना है, बस तो यहाँ पर हम बना सकते हैं void, change department, change department function क्या करता है, एक string लेता है, इसको हम new department कह सकते हैं, new department नाम की string लेता है, और पुरानी जो ही हमारी department value थी, इस department value के अंदर, यह new department वाली value assign कर देता है, तो यह हमने अपना एक method लिख दिया, इसके अलावा हम different different जितने भी चाहें, उतने member functions इन्हें इसलिए कहते हैं क्योंकि ये जो functions हैं ये हमारी class के member बन जाते हैं तो इसलिए इनको member functions भी बोल दिया जाता है तो जहां भी member functions सुने जहां भी method सुने मतलब हम class के functions की बात कर रहे हैं तो इस तरीके से तो हमने अपनी class को create कर दिया अब object को कैसे create करें object को create करने के लिए हम main function के अंदर क्या कर सकते हैं फिर अपनी object का नाम लिखेंगे object को हम obj1 भी लिख सकते हैं या ये अगर teacher है तो इसे t1 गह देते हैं तो ये हमारी teacher t1 object बन गई, मतलब हमने अपने first teacher के लिए एक object create कर ली, इसी तरीके से हम चाहें तो जितने मरजी teachers के लिए, objects create कर सकते हैं, यह हमारी T3 object हो गई, यह हमारी T4 object हो गई, और अब हर एक जो individual object बनी है, हर एक individual object के पास अपना name, department, subject, salary, सारी information है, बस हमें क्या करना है, अब उस information को जाकर update करना है, अब let's take an example of only this teacher T1, अब अगर T1 को हम value assign करना जाते हैं, यानि अगर हमें किसी भी object के लिए उसकी properties को access करना है, तो हम dot operator का use करते हैं, डॉट operator कहने का मतलब है कि for example हमने एक object create की teacher T1.

अब हमें पता है internally T1 के पास different different properties आ गई हैं, T1 के पास एक name भी है, T1 के पास एक department भी है, दूसरी भी information है, अब T1 का अगर हमें name access करना है, तो हम simply लिखेंगे T1.name, तो इसे अब हम एक single variable की तरह treat कर सकते हैं, इसके अंदर कोई value assign करनी है, तो equal to value लिख देंगे, इसकी value print करवा T1 object के name property को access करने की कोशिश कर रहे हैं, उसी तरीके से अगर function को access करना है, method को access करना है, तो T1.changeDepartment, इस तरीके से हम अपने method को access कर सकते हैं, तो let us try to assign a name to the teacher, let's suppose T1.name में मैंने अपना name लिख दिया, और t1. subject के अंदर इसी तरीके से हम subject लिख देते हैं c++ and t1. department के अंदर हम department में लिख देते हैं let's suppose computer science and t1. salary में मैंने अपनी एक let's suppose 25,000 की salary लगती है, अब ये क्या हो गई, ये मेरी basic values हो गई, जिनको मैंने assign कर दिया, पर अभी अगर हम इस code को run करेंगे, वैसे तो अभी कुछ नहीं print होना चाहिए, यहाँ पर cout करते हैं t1.name की value को, अभी अगर हम इस code को, simple से code को run करनी की कोशिश करेंगे, तो this is the command that I am writing for running the code, क्योंकि मेरी file का नाम है oops.cpp, तो मैं यहाँ पर oops.cpp लिख रही हूँ, G++ compiler को I am invoking, मैंने flag इसलिए use किया है, क्योंकि मैं C++ 11 को use कर रही हूँ, पर आप इसको बिल्कुल हटा सकते हैं company terminal command से, and this is the executable file जो मेरे लिए generate होगी, एरर कह रहे है department is a private member of teacher, salary is a private member of teacher, name is a private member of teacher, implicitly declared private here, तो ये बार बार ये private member, private member इस तरीके की चीज़ें क्यों दिखा रहे हैं मुझे, actually जब भी हम classes and objects को study करते हैं, तो उसमें सिर्फ properties और सिर्फ member function define करना काफी नहीं होता, इनके साथ साथ हमें एक और additional चीज़ define करनी बढ़त Access modifier एक special keyword होता है, keyword मतलब कोई special reserved word होता है, और हमारे पास तीन access modifiers होते हैं C++ के अंदर, एक होता है private, एक होता है public, एक होता है protected, class के जिस भी data को, data मतलब properties या attributes, class के जिस भी data and methods को, हम चाहते हैं कि वो सिर्फ accessible हो inside the class, मतलब class के अंदर जो भी हमने attributes create किये हैं, जो भी हमने methods create कि जिसको हम class के बाहर नहीं भेजना चाते हैं, सिर्फ class के अंदर तक ही उसके access रखना चाते हैं, उन सब को हम private बना देते हैं, और by default, by default, C++ के अंदर सब कुछ private होता है, C++ के अंदर आपके attributes भी private होते हैं, C++ के अंदर आपके member functions भी private होते हैं, इसलिए हमारे पास error आये था, कि यह जो name आप इस class के बाहर, मतलब main function के अंदर, यह जो हम name को access करके उसकी value change कर रहे हैं, या name को हम print करवा रहे हैं, यह सारी चीज़ें possible नहीं है, क्योंकि C++ के अंदर name क्या हो गया, इस class का एक private attribute है, उसको हम class के बाहर access कर रही ही नहीं सकते, तो वो error access modifier की वज़े से आ रहा था, तो अगर किसी भी class के अंदर explicitly, अगर हम किसी भी चीज़ को private दिखाना जाते हैं, त तो private colon लिखने का मतलब है, इसके बाद जितनी भी चीजें लिखी होंगी, वो सारी के सारी automatically private हो जाएंगी, by default भी private होती है, पर हम इस तरीके से लिख कर भी बता सकते हैं, we have another access modifier, जिसका नाम होता है public, जिस भी चीज को हम public declare करेंगे, data और methods को, वो सारे के सारे सब को accessible होंगे, मतलब उनको हम class के अंदर भी access कर सकते हैं, जैसे for example यही पर private की जगए, अगर मैंने लिख दिया public, तो उसका मतलब है ये पूरा data and ये पूरी values, ये पूरा function, अब class के बाहर accessible होगा, तो ये तो हो गई class, अब ये main function के अंदर भी हम access कर पाएंगे, और अब हमारे code के अंदर कोई error नहीं आएगा, let us minimize this a bit, and rerun our code, तो जैसे code को हम rerun करेंगे इस बार, तो हमारे लिए हमारे teacher का protected protected को वैसे जब हम inheritance का concept करेंगे तब और ज़ाधा detail में कर रहे होंगे क्योंकि अभी इसका concept इतना जाधा आपको clear नहीं होगा पर protected का मतलब होता है जिस भी data and method को हम एक तो class के अंदर accessible कराना चाते हैं और एक अपनी derived class के अंदर accessible कराना चाते हैं basically जब inheritance होती है तो एक class अपन तो वहाँ पर जिस भी private property को हम इस चोटी class के अंदर भेजना चाहते हैं उन सारी properties को हम protected बना देते हैं या उन methods को हम protected बना देते हैं पर ये वाला जो concept है ये protected का concept inheritance करते टाइम हम detail में करेंगे तो ये वहाँ पर आपको पूरा clear हो जाएगा अभी के लिए सिर्फ private and public के उपर focus करना है private वो है जिसे class access कर सकते हैं class के अंदर मतलब ये function private को access कर सकते हैं यहाँ पर department private था तो यहाँ कोई error नहीं आएगा लेकिन public को हमारा main function भी access कर सकता है या public को कोई दूसरी class भी access कर सकती है, हम चाहते तो एक class हमने यहाँ teacher की बनाई थी, एक class हम यहाँ अपने student की भी बना सकते थे, तो student की भी different properties हो सकती है, तो student की इस तरीके से हम अपनी properties define कर सकते हैं, कि student के पास एक student का नाम होगा, एक हो सकता है integer role number हो student का, एक हो सकता है integer age हो student की, तो इस तरीके से multiple properties हमारी student class की भी हो सकती है, जो student class की object के पास हो, अब let's suppose हमने इस तरीके से अपनी class create की teacher class, अब वैसे तो generally जो colleges के system होते हैं, उसमें name, department, subject ये ऐसी चीज़ें हैं जिनकी access हम हर किसी को दे सकते हैं, पर salary की access generally जो हमारी accounts वाली team होती है, उसके पास होती है, तो हम क्या कर सकते हैं, इस salary को हम public की जगे एक private member बना सकते हैं, तो यहां से इसे cut कर लेंगे, और उपर क्या करेंगे, अपना एक private flag हम declare कर सकते हैं, private access modifier, और यहां पे अपनी salary को declare कर देंगे, तो अब यह हमारी teacher class है, जिसमें यह member private है, और ये जो सारे के सारे members हैं, ये सारे के सारे members public हैं, अब यहाँ पर जब हम salary को access करेंगे, तो अब यहाँ पर error आएगा, क्योंकि salary अब क्या बन गई, salary अब private बन गई, तो यहाँ पर salary is a private member of teacher, तो इस value को अब हम यहाँ पर access नहीं कर पाएंगे, पर बाकी सारी values को हम access कर सकते हम कुछ data members को private बनाते हैं, कुछ को हम protected बना रहे होते हैं, अब generally जो भी हमारे protected data होते हैं, कभी-कभी अगर हमें उनकी access भी देनी होती है, main function को या किसी दूसरी class को, तो हम directly access नहीं देते हैं, जैसे for example, main में अगर मुझे फिर भी अपने teacher की salary को set करना है, या salary को print करवाना है, तो उसके लिए हम कुछ special functions बना सकते हैं, और उन functions को हम public रख सकते हैं, for example, मैंने एक function बना दिया, void set, salary, set salary का मतलब है कि salary की value को set कर दो, तो हम यहाँ पे int कोई salary की value s ले लेंगे, और जो हमारी salary है, यहाँ पे salary variable कौन सा है, यह वाला variable है, this will be a double value, तो salary के अंदर हम assign कर देंगे, यह S वाली value, तो उससे क्या हुआ, इस function से हम salary की value set कर पाएंगे, और एक और function मना लेते हैं, double, get salary, get salary function क्या करेगा, return कर देगा, हमारे salary की value को, अब यहाँ पे हमारा सवाल आ सकता है कि अब तो हमें access मिली गई, even though हमने salary को private बनाया, पर फिर भी इन function से हमें access मिल गई salary की, तो यह वाली access फिर भी कई सारे cases में चल जाती है, और यह जो special functions होते हैं, इस function को इसका एक technical नाम होता है, इसको हम setter कहते हैं, और यह वाला जो function हो पर हाँ indirectly in public functions के थूँ access कर पाएंगे अब हम चाहें तो value set कर सकते हैं दुबारे से अपनी salary की तो t1.set salary के अंदर हम दुबारे से 25,000 अपनी value pass कर देंगे और यहाँ पर इस बार हम see out करवा सकते हैं t1.get salary तो हमारे पास value भी return होकर आ जाएगी तो इस तरीके से हमारी जो पूरी इनफॉरमेशन है उसे हम चाहें तो प्रिंट कर आ सकते हैं अब नेक्स्ट हम बात करने वाले हैं उप्स के अंदर एक और इंपोर्टेंट टर्म के बारे में जिसको हम कहते है एनकाप्सुलेशन उप्स जो सबजेक्ट है ना पर उप्स के अंदर डिफिकल्ट एक छोटी सी चीज है उप्स के चार मेजर पिलर्स होते हैं, चार मेजर पिलर्स मतलब उप्स का जो हमारा ये पूरा वानशॉट है, इसके अंदर चार मेजर टॉपिक्स हैं, जो आपसे इंटरव्यूस के अंदर पूछे जाते हैं, इन में से पहला होता है कि encapsulation बताओ कि क्या होता है, encapsulation बताओ, encaps इन चारों शब्दों को हम OOPS के Pillars कहते हैं, और इन चारों की Definitions आपको by heart याद होनी चाहिए, क्योंकि यह आपके Interviews में तो पूछी जाएगी, कई बार Computer Science के Students के जितने भी College Exams होते हैं, उनमें भी OOPS में आ जाती हैं, और इनकी Definition बहुत असान है और उसको हम बहुत सारे Examples क basically encapsulation का मतलब होता है कि आपने कुछ data लिया data मतलब आपने कुछ properties लिए और आपने कुछ member functions लिये member functions लिये, normal functions लिये, और उन सब का आपने क्या किया, जोड़ के एक capsule बना दिया, मतलब इन दोनों चीज़ों का हमने जोड़ के क्या किया, एक capsule बना दिया, तो ये हो गया encapsulation, और ये जो capsule होता है, इसको हम कह देते हैं अपनी class, तो encapsulation is nothing, हमने कुछ data लिया, मतलब कुछ properties लिये तो encapsulation को हम already कर चुके हैं, यह जो teacher class हमने बनाई, इस teacher class के अंदर हमने कुछ properties लिखी, कुछ data लिखा, और कुछ functions लिखे, तो यह क्या किया हमने, यह हमने encapsulation को implement किया, तो एक class बनाना और उसके अंदर member functions को और अपने data members को declare करना ही encapsulation होता है, तो बस इसकी definition याद कर लेनी है, wrapping up of data and member functions in a single unit ये जो capsule है ये एक single unit है जिसको हम class कह देते हैं तो ये हो गया encapsulation अब जो हमारे encapsulation का concept होता है ये हमें data hiding में help करता है data hiding का क्या मतलब है data hiding का मतलब होता है important जो information है जो sensitive information है उसको hide कर लेना और encapsulation का concept data hiding में कैसे help करता है basically जो भी आपकी sensitive information है उसके लिए आप private access modifier use कर दो उस sensitive information को आप private बना दोगे तो class के बाहर हमारी जो भी sensitive information होगी उसके access बाहर नहीं होगी तो किसी को भी उसका पता नहीं चलेगा जैसे for example हम C plus इसमें एक bank का system design करते हैं तो उनके लिए हम एक class बना सकते हैं let's create a class called account अब इस account class के बहुत सारी different different values होगी बहुत सारा different data होगा जैसे for example एक तो हमारी account id हो जाएगी उसके अलावा हमारे account में कोई user name हमने दिया होगा, अपने user को, वो user name आ जाएगा हमारे account का, साथ के साथ floating या double का हम अपना balance शो कर सकते हैं, कि हमारे account में अभी कितना balance है, अब let's suppose किसी bank system के लिए, ये जो balance वाली information है, this is very sensitive, आप किसी को account ID दिखा दो, आप किसी को user name दिखा तो ये किसी भी user का password भी बहुत जाधा sensitive information हो जाता, इसको हम नहीं चाहते कि class के बाहर इसकी access किसी के पास हो, class के बाहर access ना होने का मतलब है, क्योंकि अभी तो हम single file में चीज़ों को use कर रहे हैं, पर जब भी आप company के अंदर जाएंगे, जब भी हम किसी बड़े से banking system के ऊपर तो वहाँ पे हम नहीं चाहते दूसरी फाइल्स के पास हमारी पासवर्ड की या हमारे बैलेंस की इंफ़र्मीशन हो, तो इन दोनों डेटा मेंबर्स को उठा के अ इस तरीके से, तो ये क्या हो गया, ये हमने basically implement किया है data hiding को in our code, कि जो हमारा sensitive data था, उसको या तो private बना दो, या उसको protected बना दो, तो वो data क्या हो जाएगा, वो data hide हो जाएगा, बाकी जो normal classes या बाकी जो normal functions हैं उन सब से, ये वाला data फिर भी public है, इसको कोई भी access कर सकता है, इस तो इस तरीके से हम data hiding को भी implement करते हैं using encapsulation. Class बनाई, तभी तो access modifiers को use कर पाए, और access modifiers को use किया, तभी तो data hiding हो पाई.

तो यही basic concepts होते हैं, जो हमसे interviews के अंदर पूछे जाते हैं. आपसे पूछ लेंगे encapsulation क्या होता है, encapsulation का example दीजिए, data hiding क्या होती है, data hiding का example दीजिए, access modifiers कौन-कौन से होते हैं C++ के अंदर, तो next we are going to talk about a special function called constructor जब भी हम classes and objects की बात करते हैं constructor एक काफी important concept होता है पैसे तो बहुत easy concept है constructor क्या होता है एक special method होता है special method मतलब ये एक बहुत special function है जो automatically invoke हो जाता है automatically इसको call कर देता है C++ जब भी हम किसी नई object को create करते हैं for example अपने code के अंदर आते हैं अपने code के अंदर हमने अपनी teacher object बनाई है, कहाँ पर बनाई है, यह हमारी teacher class है, let us minimize this, यह हमारी teacher class है और इस teacher class के लिए हमने यहाँ पे अपनी teacher object बनाई है, जैसे ही यहाँ पे हमने object creation वाली line लिखी, वैसे ही automatically, internally क्या हो रहा है, constructor को call जा रही है, वो call हमें नहीं दिखता कैसे जा रही है, कैसे नहीं जा रही है, पर compiler क्या करता है, automatically constructor को call कर देता है, जब भी हम कि को initialize करना कहने का मतलब यह है कि जब भी हम कोई class बनाते हैं class तो क्या है class तो एक blueprint है कि हमारी object के अंदर क्या member functions होने चाहिए क्या उसके अंदर data होना चाहिए किस तरीके से एक object को create होना चाहिए क्लास उसका blueprint बनाती है, क्लास memory के अंदर कोई खास space occupy नहीं करती, लेकिन जब भी हमें class से कोई object बनानी पड़ती है, let's suppose यह हमारी object 1 हो गई, यह हमारी object 2 हो गई, यह हमारी object 3 हो गई, तो यह जो individual objects होती हैं, यह memory के अंदर occupy करती हैं, तो इनहीं को जो memory allocate होती है, memory allocate होना मतलब memory के अंदर इनके जो भी data members हैं, उनके लिए space allocate होना computer की memory के अंदर साथ के साथ वो जो data members हैं उनको अगर आप किनी values के साथ initialize करना चाहते हैं तो वहाँ पर हम क्या करते हैं वहाँ पर हम constructors का use करते हैं और अगर हम खुद constructor नहीं बनाते तो C++ automatically हमारे लिए constructor बना देता हैं जैसे अभी teacher class के अंदर हमने कोई special function constructor नहीं बनाया हुआ तो यहाँ तो इसलिए as a programmer हमें खुद के constructor भी बनाने आने चाहिए अब एक constructor की कुछ basic properties होती हैं पहले उनको समझते हैं और फिर जानते हैं कि ये initialization का exactly मतलब क्या है constructor एक ऐसा function होता है जिसका नाम same होता है as the class और constructor का कोई return type नहीं होता मतलब अगर अपनी teacher class के लिए हम एक constructor create करना है, तो हम यहाँ पे आके एक function मना देंगे, इस function का नाम भी teacher होगा, पर यह क्या है, यह class नहीं है, यह एक function है, और इस function का कोई return type नहीं है, return type void भी नहीं है, string भी नहीं है, int भी नहीं है, bool भी नहीं है, float भी नहीं है, कुछ भी नहीं है, बस यह एक function मन गया, और इस तरीके से, इस function के अंदर, हम see out करा सकते हैं, Hi, I am constructor. इस तरीके से हम ये simple सी, प्यारी सी statement c out करा देंगे, और ये हमने क्या बना दिया, ये हमने constructor बना दिया, तो इस बार, जब हम अपनी teacher t1 object को create करेंगे, तो जब ये line execute होगी, तो इस बार हमने, ने अपना constructor लिखा हुआ है तो compiler वाला default constructor नहीं बनेगा तो जैसे ही हम object को create करेंगे हमारा ये वाला constructor function call हो जाएगा तो let us run our code तो सबसे पहले ये line print होके आएगी hi I am constructor जो दिखाती है कि सबसे पहले main के अंदर ये line अगर run हुई थी तो constructor वाली ही line print होगी अगर हम एक और object यहाँ बना देते teacher t2 तो दो बार line print होती, hi I am constructor, hi I am constructor, क्योंकि पहली बार object के लिए constructor call हो रहा है, फिर दोबारा call हो रहा है, तो बार बार वो इस same line को print करवाएगा, अब constructor के अंदर initialization करने का क्या मतलब होता है, initialization करने का मतलब होता है कि कुछ data members के लिए आप value पहले assign कर दो, जिसे for example हम चाहते हैं हमारे जो सारे teachers हैं, उन सब के लिए department पहले ही set हो जाए कि ये सारे के सारे teachers computer science department के हैं, तो department की value computer science हो जाए हर एक teacher के लिए, तो उस value को बार-बार हमें जाकर set नहीं करना पड़ेगा, वो automatically जैसे ही object create होगी, वैसे ही department computer science हो जाएगा, तो अगर हम यहाँ पर आते हैं, main function के अंदर, तो यहाँ हम t1.department is equal to computer science नहीं लिखेंगे, t1.department को, तो भी call के अंदर हमने teacher t1 को create किया, उसके बाद उसके अंदर हमने कुछ values assign की पर department assign नहीं किया पर constructor नहीं क्या किया होगा constructor ने automatically department computer science कर दिया होगा तो जब हम t1.department को print करवाएंगे तो हमारे पास output में computer science print होकर आ जाएगा, तो यह क्या किया, हमने department की value को initialize कर दिया in our constructor, अब जो constructor function होता है, ऐसा नहीं है, इस constructor function को हम अलग से कभी भी call कर सकते हैं, constructor function एक ही बार call होता है, जब हमारी object create होती है, at the time of object creation, तो constructor is only called once at object creation, और constructor को call करने का हमें extra काम नहीं करना पड़ता, constructor को automatically call चले जाती है, अब इसके साथ में generally हमारी classes होती है, constructor को हम हमेशा public declare करते हैं कभी भी constructor को हमें private की तरह नहीं बनाना क्योंकि constructor को main function से call जा रही होती है internally automatically तो main function के पास private members की access नहीं होगी इसलिए constructor को हम हमेशा public की तरह ही declare करते हैं तो ये तीन properties तो हमने देख ली इसके साथ साथ memory allocation happens when constructor is called इसका क्या मतलब है for example हमने एक class बनाई simple सी हमने एक class बनाई Let's call it A. A class के अंदर हमने एक integer x बनाया, तो इस तरीके से हमने integer x कर दिया, अब हम A class की object बनाते हैं, यह A class की object 1 है, यह A class की object 2 है, तो जब हम यह वाली class बना रहे हैं, तो memory के अंदर as such कोई space occupy नहीं हो रही, space occupy कब होगी, space occupy यानि memory allocation तब होगा, जब हम एक object create करेंगे, तो जैसे यह object 1 create होती है, तो let's suppose यह हमारे computer की memory है, तो computer की memory के अंदर object 1 को कुछ जगे दी जाती है, और उसी के अंदर उसके सारे variables जाके store होते हैं, मतलब object 1 के लिए हमारे पास क्या होगा, हमारे पास x यह वाला variable होगा, तो इस variable x के लिए यहाँ पे जगे allocate होगी, जब हम object 2 को create करेंगे, तो object 2 को memory के अंदर जगे मिलेगी, और object 2 का जो x होगा, future में कोई और objects create होती हैं, A class की, तो उनके लिए अलग से space allocate होगी, और इस तरीके से जो memory allocation होता है, वो objects के लिए होता है, वो classes के लिए नहीं होता, और वो कब होता है, वो तब होता है, जब हमारे constructor को call जाती है, चाहे वो compiler वाला constructor हो, चाहे वो हमारा constructor हो, तो objects को memory allocate करने का काम होता है, यह internally हमारे constructor का होता है, अब जब भी हम constructor को पढ़ते हैं, there are three types of constructors, that we study in C++, एक होते हैं हमारे non-parameterized, नॉन पारेमीटर आईस कंस्ट्रक्टर वैसे तो कॉंप्लेक्स लग रहा होगा सुनने में पर इसका मतलब है कि इसके कोई पारेमीटर्स नहीं है जैसे एक फंक्शन के कोई पारेमीटर्स नहीं होते अब इस कंस्ट्रक्टर को अगर हम देखें तो इस कंस्� इस अ नॉन पारामीटर राइस्ट कंस्ट्रक्टर क्योंकि इसके अंदर कोई भी पारामीटर नहीं है पेरेंथेसिस के अंदर दूसरा हमारा कंस्ट्रक्टर का टाइप होता है हमारा पारामीटर राइस्ट कंस्ट्रक्टर जिसके अंदर कुछ पारामीटर्स होते हैं और तीसरा हमारा कंस्ट्रक्टर जिसको हम पढ़ते हैं वो होता है हमारा कॉपी कंस्ट्रक्टर अब सबसे पहले पारामीटर राइस्ट कंस्ट्रक्टर की बात करते हैं नॉन पार और उसके अंदर हम कुछ parameters define कर दें, जैसे for example अभी तो हमने department computer science किया है, पर हम क्या करेंगे, जैसे ही object बनेगा, अलग से इन values को assign करने की जगे इसी एक ही line में सारी values ले लेंगे, यानि यहाँ पर हम एक parameter ले लेंगे, string n, जो हमारे name के लिए short हो जाएगा, एक parameter ले लेंगे, पारामीटर ले लेंगे double salary जो हमारी salary के लिए short हो जाएगा तो हम यहाँ पर जो भी हमारा name है उसे n की value assign कर सकते हैं जो भी हमारे department है उसे d की value assign कर सकते हैं जो भी हमारा subject है उसे s value assign कर सकते हैं and we can assign salary वाली value using this साल वेरिबल, तो इस constructor के अंदर क्या हुआ, इस constructor के अंदर 4 parameters आ गए, और यहाँ पे हम object का वही initialization कर रहे हैं दुबारा, तो यह एक अलग constructor है, और यह एक अलग constructor है, इसे एक बार के लिए comment out कर देते हैं, और इस बार जब हम अपनी object को create करेंगे, तो इस तरीके से अलग से स T1 का जो constructor है, वो सबसे पहले कौन सी value लेता है, सबसे पहले उसके पास 3 strings जानी चाहिए, name, department और subject की, तो name में हम Shraddha send करेंगे, department में let's send computer science, subject के अंदर हम C plus अच्छेंट करेंगे, और salary के अंदर हम अपनी value को चेंट करेंगे, तो इस तरीके से single line के अंदर ही सारी values हम constructor के अंदर pass कर सकते हैं, एक parameterized constructor के अंदर, और वो values initialize हो जाएंगी, और एक और यहाँ पर हम function बना लेते हैं, let's call this function void getInfo, get info क्या करेगा, get info see out कर दा देगा हमारी teacher की सारी information, तो teacher का जो name है, या अभी के लिए, name input कराते हैं, and अपना subject input कराते हैं, तो subject हो गया, and this will be equal to subject, तो हम अपने teacher के लिए क्या करेंगे values assign कर दी और t1.getInfo को हम call लगा देंगे तो हमने कुछ नहीं किया एक parameterized constructor declare किया जिसके अंदर कुछ values आएंगी वो values object को assign हो जाएंगी और फिर हम उन values को print करवा देंगे let's clear this and rerun our code तो वो values हमारे लिए assign हो गई और हमारे लिए अपने name and subject की value print हो गई तो इस तरीके से हम non-parameterized constructors को भी create कर सकते हैं अब एक class के अंदर multiple constructors भी हो सकते हैं गिवन कि उन Constructors के Parameters डिफरेंट हो, मतलब Teacher और Teacher, ये दोनों सेम नाम के Constructors एक ही Class के अंदर हो सकते हैं, बस इनके Parameters अलग होने चाहिए, जैसे for example यहाँ पे एक भी Parameter नहीं है, यहाँ पे चार Parameter है, हम एक और बना सकते हैं जिसमें तीन Parameters हो, एक और बना सकते हैं जिसमें हमारे लिए detect हो जाएगा कि हमने यहाँ पे 4 values भेजी हैं और उन values के type हमें पता है तो हमें पता है automatically यही constructor call होगा यह वाला तो call होगा नहीं यह जो phenomena होता है जिसमें multiple constructors हमारे पास हो सकते हैं उनका नाम same हो सकता है बस उनके type जो different होते हैं, इस phenomena को या इस concept को हम programming के अंदर कहते हैं constructor overloading, and constructor overloading is an example of polymorphism, polymorphism को हम बाद में जाके detail में study करेंगे, पर polymorphism का ही एक example constructor overloading होता है, तो मारी classes के अंदर कई जगें हमें constructor overloading देखने को मिलती है, तो यहां तक हमने non-parameterized constructor को पढ़ लिया है, parameterized constructor को पढ़ लिय अब copy constructor के बारे में बात करने से पहले हम एक और special concept के बारे में बात करने वाले हैं, which is our this pointer, तो C++ के अंदर this एक special pointer होता है, that points to the current object, for example, हम अपनी किसी object 1 के लिए उसके किसी function को call कर रहे हैं, अब इस function को, अगर इस object की properties को refer करना है, तो या तो ये जो function है, ये उन properties को access कर सकता है by writing property, तो यहाँ पे हमें already पता होगा कि ये जो property है, यह हमारी इस object की property है, या फिर इसी चीज को लिखने का एक और दूसरा तरीका होता है, कि हम लिखते हैं this, और फिर हम लगाते हैं arrow वाला symbol, arrow वाला symbol कैसे, हम लिखते है hyphen, यानि dash, और उसके बाद greater than वाला sign, and फिर हम लिखते हैं this property, इस property कहकर भी हम यह कह रहे हैं, कि हमारी इस वाली object की properties की हम बात कर रहे हैं, अब this pointer की जरूरत क्यों पड़ी, जैसे for example, यहाँ पर हमने अपने teacher वाला parameterized constructor बनाया हुआ है, अब इस parameter आई इस constructor के अंदर हम नहीं चाहते कि हमारे ये जो parameters के नाम हैं ये इस तरीके से हम short में रखें हम चाहते हैं कि यहाँ पे string को भी हम complete name नाम दे string को हम department नाम दे, string को हम पूरा subject नाम दे, variable को हम पूरी salary नाम दे तो यहाँ पे basically हमें लिखना पड़ेगा name is equal to name ये left वाला name किसका name है?

ये left वाला name हमारी class का name है, in fact ये जो सारी properties हैं इन सब properties को हम चाहें तो top में लिख सकते हैं, तो यहाँ पर जब हम left में name लिख रहे हैं, left में name लिखने का मतलब है कि हम object के name की, object की name property की बात कर रहे हैं, और यह जो right वाला name है, हम चाहते हैं यह हमारा parameter रही, पर जब हम इस तरीके की statement लिख देंगे न, तो वो हमारे constructor के लिए, compiler के लिए तो अगर हमें दिखाना है कि ये left वाला name हमारे object का name है तो हम उसके लिए लिख सकते हैं this hyphen greater than तो ये हमारा arrow का symbol हो गया this is the arrow operator और इस तरीके से हमारा जो left वाला name है अब हमें पता चल जाएगा ये हमारी object की property है department के लिए भी अगर left में भी department है right में भी department है तो हम left में लिख देंगे this department यानि ये object का department है और ये जो right में department वाली value है ये हमारी function का parameter है ये हमारे constructor का parameter है left में लिख दिया this subject, यह हमारे object का subject है, और यह जो subject है, यह हमारे constructor का parameter है, left में लिख दिया this salary, तो यह object की salary है, और right में जो salary value है, यह हमारे constructor का parameter है, तो इस तरीके से हम object की properties को access करने के लिए this pointer को use कर सकते हैं, अब इसे save करेंगे, तो हमारे code के अंदर आज सच कोई error नहीं आएगा, क्योंकि यह complete सही syntax था, अब run करेंगे, तो बिल्कुल same output we are going to get, अब this pointer काम exactly कैसे करता है C++ के अंदर अगर कोई भी object create होती है for example हमने किसी class की कोई एक object create की है तो हमारा this क्या करता है हमारा this एक special pointer होता है अगर ये हमारी object है और ये इस object की पूरी की memory इसने occupy की है तो this क्या करता है this इस memory को point करता है यानि अगर इस memory का address let's suppose 100 के equal है तो this भी अपने आप में एक variable होता है जो अंदर 100 store करता है एक automatic create होने वाला pointer है जो हमेशा इस object को, जो भी calling object होती है, जो function को call कर रही है, उस object को point करता है, तो हमारे constructor के अंदर calling object कौन सी है, constructor के अंदर calling object है, यह T1, जिसके लिए constructor call किया जा रहा है इन सारी values के साथ, तो this के concept को समझने से पहले, सबसे पहले तो हमारी basic C++ के जो pointers की knowledge है, वो थोड़ी सी clear होनी चाहिए, तभी इसकी हमें और जादा clarity आईगी, तो यहाँ पर अगर आपको C++ pointers अभी तक आपने नहीं पढ़े हैं, तो पहले जाकर उनके basic समय पढ़ लेने है, क्योंकि pointers are really really important in C++, क्योंकि majority data structures pointers को use कर रहे होते हैं कहीं ना कहीं, तो जब भी हम एक pointer declare करते हैं C++ के अंदर, let's suppose हमने एक int star ptr declare किया, जो किसी integer x जिसके अंदर 10 store था, उसका address store करा रहा है, तो अगर हमें कभी भी इस x की value access करनी होती है, यह जो star होता है, यह C++ के अंदर हमारा dereferencing operator होता है, star के बहुत सारे काम होते हैं, star multiply के लिए भी use होता है, और star dereferencing operator की तरह भी use होता है, dereference करने का मतलब होता है pointers के अंदर, कि pointer जिस value को point कर रहा है, मतलब pointer अगर x की value 10 को point कर रहा है, तो star pointer केने का मतलब है, हम इस 10 की बात कर रहे हैं, तो star this अगर हम लिख देंगे, if we write star this, तो इसका मतलब, हम अपनी object की बात कर रहे हैं, और अगर हमें object.property लिखना है, तो हमें लिखना पड़ेगा star this.property, अब ये जो star this.property है, इसी को लिखने का एक और असान तरीका दिया गया है C++ के अंदर, which is this arrow operator, तो arrow operator कोई ऐसा नई चीज नहीं है, हम pointers की ही इस complex सी चीज को बस ऐसे arrow से इसके साथ हम arrow operator को use कर रहे हैं, बाकि concept वही use हो रहा है, जो normal integer pointer, character pointer के साथ हम use करते हैं CPSS के अंदर, तो it is not a very tough concept, यह tough आपको तब लग सकता है, जब हमने pointers नहीं पड़ी, तो इसलिए अच्छी interview preparation के लिए, इस पूरे lecture को देखने के बाद, एक बार pointers को हम जाकर थोड़ा सा revise कर सकते हैं, अब next हम बात करने वाले हैं अपने third type of constructor के बारे में, which is called the copy constructor, copy constructor बिल्कुल अपने नाम की तरह काम करता है, यानि इसका काम होता है objects को copy करना, यह एक object की properties उठाता है और उस object की दूसरी हमें copy बना के दे देता है, exact, तो copy constructor is a special constructor, which is used to copy properties of one object into another. अब अगर हम खुद से copy constructor नहीं मनाते, तो C++ हमारे लिए एक default copy constructor खुद से बना देता है, जैसे for example, हमने teacher बनाया T1 इन सारी values के साथ, अब let's suppose हम एक teacher बनाते हैं T2, और T2 में constructor के parameters में, instead of passing all of these values, हम क्या pass करेंगे, in fact, अगर आप Visual Studio Code use कर रहे हैं, VS Code use कर रहे हैं, तो उस पर आप hover करेंगे, तो यहाँ पर कुछ suggestions भी आ जाते हैं, जैसे यहाँ पर एक suggestion आ रहे है, you can pass a constant teacher address, मतलब reference हम pass कर सकते हैं किसी और teacher object का, तो वही same चीज हम pass करने वाले हैं, यानि हम T1 को pass करने वाले तो देखते हैं क्या print होगा, इसको कर देते हैं comment out, यहाँ पे हमने क्या किया, T1 के लिए तो information लिखी है, T2 में सिर्फ T1 pass किया है, और T2 के लिए get information किया है, अब T2 की तो information में कभी define नहीं की, पर फिर भी यह code हमारे लिए सही output print कर आएगा, which is T1 की ही information, तो यहाँ पे क्या हुआ, जब हमने इस तरीके का syntax लिखा, तो यहाँ पे हमारे लिए C++ का default copy constructor invoke हो गया, invoke हो गया या उसे call हो गया कुछ भी कह सकते हैं, पर यहाँ पे basically default copy constructor call हुआ, अब copy constructor कैसे copy बनाता है, let's suppose हमने एक object बनाई T1, let's suppose this is my object T1, अब T1 के अंदर कुछ name की value हुई होगी, जो store हुई होगी, let's suppose यहाँ पे Shraddha store हुआ था, कुछ subject की value हुई होगी, कुछ हमारे department की value हुई थी, हमने computer science department रखा था, कुछ salary की value थी, हमने 25K रखी थी salary अब जैसे ही हम ये एक single statement लिखते हैं यानि copy constructor को invoke करने वाली वैसे ही memory के अंदर ये पूरी की पूरी जो हमारे पास object है इसी के जैसी exact copy हमारे पास बन कर जाती है और उसका नाम हो जाता है memory के अंदर T2 तो इस तरीके से एक copy create हो जाती है अब हम चाहें तो खुद का भी copy constructor बना सकते हैं copy constructor बनाने में कुछ नहीं करना बस यहाँ पे एक third type of constructor let's call it the copy constructor, हम बना सकते हैं, इसका नाम रख देंगे teacher, और इसके अंदर, let's remove this non-parameterized constructor, और इस teacher constructor के अंदर, basically हमारे पास एक teacher type की ही object आएगी, तो teacher type की हमारे पास एक object आएगी, और इस object को हम pass करते हैं by reference, अब pass by reference का जो मतलब होता है c++ के अंदर, let me also write this, इस पास बाई रेफरेंस उसका मतलब या तो अगर आपने C++ में call by value, call by reference पढ़ा था functions पढ़ते टाइम तो वहाँ पर समझ लिया होगा नहीं तो pointers के concept में generally हम pass by reference को देख रहे होते हैं परना pass by reference का यह मतलब होता है कि यहाँ पर जिस object की हम बात कर रहे हैं वो original object की copy नहीं है वो original object ही है मतलब यहाँ पर address pass होता है पूरी की पूरी original object का एक copy create नहीं होती तो जो भी changes इस constructor के अंदर होंगे वो हमारी इस original object के अंदर reflect करेंगे, यह मतलब होता है, पर वैसे तो हमें original object के अंदर तो कुछ changes नहीं करने, इसे original object कह देते हैं, यह teacher की original object है, और हम क्या करेंगे, this का name is equal to original object का name, dot name, this का department is equal to original object का department, this का, subject is equal to original object का subject and this की salary is equal to original object की salary, let's save this once, तो अभी तक हमारे पास हमारे default copy constructor होता था, अब हमने अपना खुद का custom copy constructor बना लिया, और यहाँ पे गुस्ते हैं, हम see out करा देंगे, I am custom, copy constructor तो इस तरीके से हम कुछ यह out करा सकते हैं ताकि हमें पता चल जाए हमारा copy constructor call हुआ है और इस बार यही same statement हम run करेंगे तो इस बार default copy constructor नहीं इस बार हमारा custom copy constructor call हुने वाला है let's see तो यहाँ पर क्या call हुआ, I am custom copy constructor, and उसके बाद हमारी सारी values जो हैं, वो T2 में जाके copy हो गई, तो T2 के लिए जब हमने get info call किया, तो उसने हमारी information print करवा दी, तो basically जो काम default copy constructor करता था, वो हमने खुद के copy constructor के अंदर कर दिया, अब जब भी object की copies बनती है, there are basically two types of copies जो create हो सकती हैं C++ के अंदर, एक copy को हम कहते है shallow copy, और एक type की copy होती है हमारी पास deep copy और दोनों में थोड़ा सा difference होता है shallow का मतलब English के अंदर होता है जो कम गहरा हो deep मतलब जो जादा गहरा हो shallow का मतलब उपर उपर से तो basically in general जो हमारा default constructor होता है जो default constructor C++ हमारे लिए बना के देता है या जो हमने भी अभी अपना copy constructor ये वाला copy constructor जो लिखा है ये सारे के सारी क्या करते हैं सारे के सारे shallow copy बनाते हैं shallow copy वैसे तो normal अगर आपके पास properties हैं तो कोई problem नहीं आएगी shallow copy बनाने में majority cases में हम shallow copy बनाते हैं shallow copy का मतलब होता है कि यह object के सारे members की values एक object से उठा के दूसरी object में copy कर देता है for example जैसा हमने इस case में देखा कि इसने क्या किया name shadda की value उठा कर यहाँ पर रख दी c plus s की value उठा कर यहाँ पर रख दी c s की value उठा कर यहाँ पर रख दी और इस तरीके से बहुत सारी values इसने उठा कर यहाँ पर copy कर दी तो यहाँ पे यह जो copy बन रही है, this is basically a shallow copy, और normal cases में shallow copy ठीक होती है, उसमें as such कोई issue नहीं आता, issue shallow copy के अंदर तब आता है, जब हम dynamic memory allocation कर रहे होते हैं, dynamic memory allocation का मतलब है, जब हम new keyword को use करके कोई नई memory allocate कर रहे होते हैं, यहाँ pointers को use कर रहे होते हैं, तब हमारे पास issue आता है, अगर हमें पता हो, हमारी जो normal memory allocate होती है, मतलब जितने भी हमारे variables create होते हैं, वो generally हमारी stack memory के अंदर create होते हैं, this is a basic C++ concept, आपने जरूर पढ़ा होगा, और नहीं भी पढ़ा तो आप पढ़ लेते हैं, basically जितने भी functions call किये जाते हैं, जैसे अगर ये मेरा main function है, तो main function के अंद वो stack memory के अंदर create होंगे, पर अगर हम कोई भी नई memory allocate करते हैं, using the new keyword, जैसे dynamically memory allocate C++ ने की जाती है, इस तरीके से, कि हमने new int 5 कर दिया, new int 5 कहने का मतलब है, कि मुझे 5 integer के बराबर नई memory दे दो, और ये जो memory दी जाती है, ये dynamic होती है, मतलब ये जो memory है, ये run time पर allocate होती है, integer function हो गया, fun function हो गया, generally जो functions होते हैं, उनको stack के उपर memory allocate की जाती है, और वो statically allocated होती है, मतलब compile time में ही memory मिल जाती है, इसको कहने का मतलब है, अगर main के अंदर मैंने एक integer x is equal to 5 define किया, तो यह जो integer x है, यह मेरे stack के अंदर memory ले लेगा, x is equal to 5, और यह यहाँ पे create होगा, और कब create होगा, compile time में इसको memory allocate हो जाएगी, पर जो भी new keyword को use करके memory allocate की जाती है, जैसे मैंने 5 size का एक array बना लिया new keyword को use करके, या मैंने simply अगर new int भी लिख दिया, तो यह new int कहां मिलेगा, यह stack पे नहीं मिलेगा, basically memory का special area होता है, जिसे हम कहते है heap, जिसके अंदर ये dynamically memory allocate होती है, और heap वाली memory है, इसी को हम dynamic memory allocation कहते है, मतलब dynamically allocated memory सारी heap पे होती है, तो shallow copy हमें तब problem देती है, जब हमारे code के अंदर, जब हमारी class के अंदर, जब हमारी objects के पास, dynamically memory allocated होती है, यानि heap के अंदर उनका कुछ ना कुछ property है, या property की तरफ कोई pointer है जो point कर रहा है पर उसकी values यहाँ पे stored है, तो इस तरीके का जब हमारे पास situation होता है, तब हमारी shallow copy हमें problem देती है, और कैसे problem देती है, उसका एक example भी देखते है, for example, let's create one more class, इस class को हम कहेंगे अपनी student class, let's suppose हमने अपने student का data store करने के लिए, student का data store करने के लिए student class को create किया, and let's talk about, this student class entirely, student के पास बहुत सारी properties हो सकती हैं, इसको कुछ public properties दे देते हैं, एक तो student के पास obviously अपना नाम होगा, और एक let's suppose इस student के पास है एक अपना CGPA, student अपना नाम store कर आता है और अपना CGPA store कर आता है, और साथ के साथ there is also this constructor in student, constructor के अंदर एक तो name आता है, और एक student का CGPA आता है, तो यह हमने constructor बना लिया, this name is equal to name, and this CGPA is equal to CGPA, इस तरीके से हमने values कर लिए, और एक और हम function बना लेते हैं, let's call it getInfo, और getInfo क्या करता है, student के लिए information print करवा देता है, cout, यहां name print करवा देगा, तो यहां पे हमारे पास name print हो जाएगा, और इसी तरीके से हम print करवा देंगे अपनी CGPA को, तो हमारे पास हमारी CGPA print हो जाएगी, तो यह हमने proper अपनी student class को create कर दिया है, अब यहाँ पर हम student class के एक object बनाने वाले हैं in our main function, main function के अंदर हमने student S1 की एक object बनाई, let's call the student राहूल कुमार, और let's suppose राहूल कुमार की CGPA है 8.9 तो हम चाहें तो S1 के लिए get info को call कर सकते हैं, तो हमारा पूरा data हमारे लिए print हो जाएगा आकर, बिल्कुल साइड data print हुआ है, कोई issue नहीं है, अब हम क्या चाहते हैं, हम चाहते हैं कि राहूल कुमार की तरह ही हमारी class के अंदर एक और S2 student आया है, उसका नाम भी राहूल कु और उसके बाद हमारा जो student S2 है, इसके लिए हम get info को call करेंगे, तो इस case में भी कोई issue नहीं आएगा, सारी की सारी information जो है, वो directly वहाँ जाकर हमारे पास copy हो जाएगी, तो अभी तक student के लिए हमने copy constructor default वाले को invoke किया, उसमें as such कोई issue नहीं आया, हम चाहें तो खुद भी अपन हमने this का name is equal to object का name and this का is equal to object का CGP ये भी कर दिया तो इस बार हमारा constructor call होगा उसमें भी as such कोई issue नहीं आएगा सारी चीज़ें same रहेंगी अब बस हम एक change करने वाले हैं अभी तक जितने भी properties हम use कर रहे थे ये सारी की सारी statically allocated memory पे चल रही थी ये सारी की सारी stack में create हो रही है इस बार हम heap का कुछ करेंगे heap का कुछ करेंगे मतलब हमारा जो student है student के लिए इस बार हम क्या करेंगे CGPA की directly value store नहीं करेंगे CGPA का एक pointer store कर लेंगे जो CGPA की value को को point करेगा, मतलब इस बार ये double CGPA नहीं होगा, इस बार ये double का pointer है, जो हमारे CGPA का pointer है, तो इस बार हमने pointer बना लिया, और जैसे हमारे पास CGPA की value आएगी, सबसे पहले तो हमें इस pointer को नई memory allocate करनी पड़ेगी, तो pointer को नई memory allocate करने time, वरना इसको करने का process देख लेते हैं, नई memory allocate करने के लिए, हम लिखते हैं CGPA pointer is equal to new float, तो basically पहले हमारा CGPA pointer क्या था पहले कहीं भी point नहीं कर रहा था यह ऐसे random pointer था मतलब memory के अंदर if we had this CGPA PTR तो CGPA PTR पहले कहीं भी point नहीं कर रहा था अब हमने क्या किया अब हमने इसे point करा दिया एक special memory की तरफ और यह कौन सी memory है यह float type की memory है यह memory है हमारे heap के अंदर क्योंकि यह dynamically allocated memory है और अब हमने क्या किया CGPA pointer जहां पर था जहां पर point कर रहा है उसको dereference करके उस जगह हमने store करा दिया अपनी CGPA को मतलब CGPA pointer जिस जगह पे point कर रहा था जिस memory address पे point कर रहा था let's suppose अगर इसका address हो जाता है 100 के equal तो CGPA pointer क्या address store करा रहा है 100 के equal तो इस 100 वाले address पे जाकर अब हमने तो इसका ये मतलब है काम वही सेम हो रहा है अभी भी हम information print करवाएंगे as such हमारे पास कोई error नहीं आएगा बस इस बार CGPA exist नहीं करता तो हमें क्या करना पड़ेगा CGPA pointer से dereference करके हमें CGPA की value find out करनी पड़ेगी ये छोटा सा change है जो हमें करना है तो पूरी चीज को एक बार summarize कर उस memory में जाके CGPA की value को store कर दिया यह जो हमारा copy constructor है यहाँ कुछ नहीं करना बस CGPA pointer की जगए है हम CGPA pointer कर देंगे तो कोई change नहीं आया और get information में CGPA pointer कर दिया तो यहाँ पर new float की जगए we actually had to do new double क्योंकि यह double को point कर रहा हमारा pointer मतलब हमारे diagram में यहाँ पर बस float की जगए इस memory का type हो जाएगा double k equal, उससे जादा कोई change नहीं आएगा, let's save the code and let's run it, तो run किया, तो as such हमारे पास कोई error नहीं आया, अभी भी name राहूल कुमार है, CGPA 8.9 है, पर अब हम एक interesting चीज़ देखेंगे, let's suppose मेरा यह जो CGPA है, second student का, मुझे CGPA को 8.9 नहीं रखना second student के लिए, मुझे तो इस CGPA को change करन या उसे D reference करके उसकी जो value है उस value को change कर देंगे हम to 9.2 कि हमारा जो student 2 है उसकी CGPA 9.2 है उसकी CGPA 8.9 नहीं है तो ये दोनों काम करते हैं उसके बाद क्या करेंगे सबसे पहले तो S1 की information get info करेंगे उसके बाद एक बार दुबारा से S1 के लिए get info करेंगे and let's try to see the change basically एक S1 student बनाया, एक S2 student बनाया, इसको कह देते हैं राहूल कुमार, इस S2 student को let's suppose इसका नाम बाद में change कर देंगे to नेहा कुमार, पहले वाला राहूल कुमार है, सेकंड वाला नेहा कुमार है, अब S1.get info जब हुआ, तो student 1 की राहूल की information print हो जाएगी, फिर हमने नेहा का क् उसके बाद दुबारा राहूल की जब हम information print करवाएंगे तो हम तो expect करेंगे कोई change नहीं होना चाहिए था राहूल के लिए तो हमने कोई CGPA के अंदर change नहीं किया यहाँ पे तो नेहा की थे उस CGPA बढ़ा के हमने 9.2 की है लेकिन जब हम finally इस code को run करते हैं let's save it and run तो ये change हमारे code के अंदर आता है, मतलब राहूल की original हमने CGPA 8.9 रखी थी, राहूल की CGPA के अंदर हमने कोई change नहीं किया, नेहा की CGPA बढ़ाई थी, तो राहूल की भी automatically CGPA कैसे बढ़ गई, ये possible हो पाया because of dynamic memory. allocation because of a shallow copy ये problem आती है shallow copy में कि जो pointer को आप pointer की value आप change भी नहीं कर रहे है उसकी value change हो गई आप तो S2 वाले के CGP pointer को change कर रहे थे न लेकिन हमारे लिए तो S1 वाला CGP pointer change हो गया ये कैसे हो पाया इसके पीछे का logic समझते हैं अब shallow copy कहता है मैं तो उपर उपर से values copy कर देता हूँ तो अब देखते हैं कौन सी values इसने copy की basically हमने अपना s1 object बनाया था इस तरीके का हमारा s1 object था s1 object के अंदर एक तो string थी name name के अंदर क्या था name के अंदर था राहूल उसके अलावा एक CGPA pointer था pointer क्या store कराता है pointer address store कराता है तो memory के अंदर, let's suppose this is the heap memory, heap memory के अंदर 8.9 कहीं आके store हुआ होगा, कौन से address पे, let's suppose ये 555, 555 वाले address पे store हुआ 8.9, तो इसने भी क्या किया, 555 वाला address store करा लिया, अब S2 कहता है, मुझे S1 की copy बना के दे दो, तो हमारे copy constructor ने उसकी बात मानी, और उसे प्यारी सी एक S1 की copy बना के दे दी, और इस copy का हमने नाम रख दिया, सब्सक्राइब करें और यह कॉपी कैसी बनी थी इस शालो कॉपी शालो कॉपी मतलब वाल्यूस कॉपी हो गई यह नाम इसका भी राहुल हो गया सीजी पे पॉइंटर में इसका भी आड्रेस 555 स्टोर हो गया क्योंकि पॉइंटर तो आड्रेस स्टोर कराएगा और ध्यान से अगर हम दिमाग लगाकर सोचें तो हमें पता चलेगा कि मेरा यह वाला सीजी पे पॉइंटर भी पॉइंट कर है क्योंकि दोनों के अंदर एवेंचुली आड्रेस तो सेमी है तो ये problem आ जाती है shallow copy के अंदर, अब अगर हम S2 के लिए, अगर हम Neha की CGPA को बढ़ा के, let's suppose करना चाते है 9.2, तो हम क्या करेंगे, इस address पर जाएंगे 555, इस address पर पहुँच गए heap में, अब इसकी value को हमने क्या किया, उठा के change कर दिया to 9.2, तो कल को जब हम S1 के लिए उसक पर वो change फिर भी reflect करता है, जब हम directly pointer की ही value assign कर देते हैं, या फिर यहाँ पर अगर हम खुद का copy constructor ना बनाए, तो भी यह same problem आएगी, मतलब यह अगर खुद का copy constructor, हम यहाँ से comment कर दे, और सोचें भाई default constructor ही हमें साइज copy बना के दे देगा, तो default constructor भी हमें यह same issue देता है, जब यहाँ पर राहूल कुमार के लिए CGP change हो गया to 9.2, तो चाहे हम खुद का constructor directly बना रहे हैं चाहे हम default constructor use कर रहे हैं ये issue आएगा जब तक हम shallow copy बना रहे हैं तो इसलिए हमें जरूरत पड़ती है अपनी deep copy की deep copy क्या कहता है deep copy के लिए constructor हमें खुद से लिखना पड़ता है automatically compiler हमें deep copy का default constructor नहीं देगा compiler तो कहता है मैं shallow copy बनाके देता हूँ मुझसे बनवानी है तो बनवालो deep copy वाला बनवाना है तो आपको खुद बनाना पड़ेगा deep copy वाले constructor के अंदर हम क्या करते हैं हम dynamically allocated जो memory होती है उसकी भी copy बनाते हैं उसके लिए हम कहेंगे original values पर आ जाते हैं हम कहेंगे कि अगर यहाँ पर 8.9 store है जिसको हमारा S1 point करवा रहा है तो हमारे S2 का जो CGP pointer है ना इसके लिए हम नया variable बनाएंगे let's suppose this heap memory is really big, तो यहाँ पर हम क्या करेंगे, यहाँ पर हम एक नई जगे allocate करेंगे, let's suppose इसका address है 600, यहाँ पर हम value 9.2 store करवाएंगे, और इसका जो address 600 है न, उसे हम यहाँ store करवाएंगे, तो right वाला pointer इसे point कर रहा है, और यह वाला pointer इसे point कर रहा है, आपने जो heap वाली memory थी, उसको भी copy किया, अगर नेहा अपने marks change करेगी तो नेहा के marks change होंगे, राहूल अपने marks change करेगा तो राहूल के marks change होंगे, अब overlap नहीं होने वाला, तो generally जब भी हमारे पास dynamically allocated memory होती है, तो हम deep copy को prefer करते हैं और हम उसी का constructor लिखते हैं, अब इस example के अंदर हम deep copy constructor कैसे बना सकते थे, खुद की deep copy क कि हमारा जो CGPA pointer है उसको कर देते new double and फिर this CGPA pointer के अंदर बस इस value को copy कर देते value को copy कर देते मतलब हमारा जो CGPA pointer है जिस value को point करवा रहा है वहाँ पे जाके हम वही value store कर देते जो हमारे object के CGPA pointer के अंदर stored है मतलब शुरुवात में तो ये भी 8.9 होता और अलग जगे पे हम यहां भी 8.9 लगाते तो दोनों जगह हम 8.9, 8.9 की दो copies बनाते हैं, क्योंकि copy constructor क्या करता है, deep copy बनाता है, फिर बाद में जाके main function में इस वाले को change करके 9.2 कर देते हैं, तो CGP pointer को पहले तो हमने दुबारा से dynamically memory allocate की, उसके बाद क्या किया, जो value original के अंदर stored है, वही value यहां पे store करवाई, अब इस उतने के उतने रहे, बस नेहा ने अपने marks change किये to 9.2, और नेहा के लिए अगर हम s2.getinfo call करते, तो वहाँ पर हमें जादा marks मिलते, नेहा के लिए call करने से पहले s2 का name भी change कर लेते हैं,.name is equal to नेहा, तो it will be more clear for us, तो यहाँ पे नेहा के marks आ गए 9.2 और राहूल कुमार के 8.9 के 8.9 नहीं रहे, so this is the great difference between shallow copy and deep copy in C++, और यह काफी important concept है, interviews के अंदर पूछ लिया जाता है, और यह सिर्फ C++ का concept नहीं है, as a good programmer, as a good developer आपको पता होना चाहिए, क्योंकि अगर आप कल को Java के साथ काम करेंगे, कल को दूसरी programming languages के साथ काम करेंगे, तो generally OOPS के concept ऐसे हैं, जो all over languages almost same रहते हैं, ऐसे ही classes आप Java में बनाते हैं, ऐसे ही classes हम दूसरी languages के अंदर बनाते हैं, तो एक बार अगर आपको C++ के अंदर concepts clear हो गए, तो generally दूसरी languages के भी concepts हमें easy लगेंगे, अब next हम बात करने वाले हैं about the concept of destructor, destructor जो होता है, destructor is opposite of constructor, जैसे constructor का काम होता है memory को allocate करना, यानि memory देना object को, destructor का काम होता है memory को de-allocate करना, यानि object को जो भी memory दी गई है हमारी memory, computer system की memory के अंदर, उसको हटाना वहाँ से उस memory को साफ करना तो destructor भी हमारा special function होता है और automatically compiler हमारे लिए खुद से destructor बना देता है जब हम नहीं बनाते हैं जैसे अभी तक हमने कोई destructor नहीं बनाया है फिर भी main function खतम होने के बाद automatically हमारी objects जो हैं वो साफ हो रही है तो automatically destructor जो है हमारे लिए बना हुआ है पर हमारा जो destructor है ना वो से statically allocated memory को deallocate करता है वही problem आ जाती है यहाँ पे जो shallow copy, deep copy में आती थी कि अगर आपने object के अंदर dynamically कोई memory allocate की है तो उसे आपको dynamically ही de-allocate करना पड़ेगा, C++ के अंदर जिस memory को हम dynamically allocate करते हैं उसके लिए अगर हम new keyword यूज़ करते हैं तो उसको de-allocate करने के लिए हमें delete keyword यूज़ करना पड़ता है let's suppose यह हमारा heap है, heap के अंदर यह कोई memory है, address है 100, यहाँ पे value let's suppose stored है 55, इस 55 की तरफ point कर रहा है हमारा कोई ptr pointer, अगर अब हमें इस memory को free करना है, तो हम लिखते है delete ptr, delete ptr का यह मतलब नहीं होता कि pointer को delete कर दो, delete ptr का मतलब होता है कि pointer जिस memory को point कर रहा है, उस memory को delete कर दो, pointer तो फिर भी रहेगा, आप यहाँ पे see out कर सकते हैं इसके बाद में ptr, तो यह जो pointer है तो survive ही करता है, pointer delete नहीं होता, पर pointer जिस memory को point करता है, heap के अंदर वो memory delete हो जाती है, तो अगर किसी भी class के अंदर हमने new से dynamically memory allocate की है, तो उसको de-allocate करना बहुत ज़रूरी है, तो यहाँ पर हमने क्या किया है, यहाँ पर जैसे हमारा जो CGP pointer है, इसको हमने new करके memory destructor has the same name as the class यानि अगर student class का destructor बनाना है तो इसका नाम भी student ही होगा अभी के लिए क्या करेंगे एक बार एक copy constructor हटा लेते हैं क्योंकि इस वाले concept को हमने cover कर लिया है और यहाँ पर भी यह सारी चीज़ें हटा लेते हैं main function के अंदर बस हमने s1 student object को बनाया है और उसके लिए फिर get info call किया है तो यह हमारा constructor हो गया destructor बनाने के लिए हमें same ही syntax लिखना होता है बस अपने function के आगे हम एक tilde का symbol लगा देते हैं जो हमारे keyboard के top left side पे हमें मिलता है tilde वाला symbol इसको बोलते हैं इस symbol को लगाते हैं और let's suppose हमने अपना खुद का destructor बना लिया जिसमें हम print करवा रहे हैं hi, I delete everything तो destructor का काम ही होता है चीज़ों को delete करना, deallocate करना तो even though destructor को हम खुद call नहीं करते पर जैसे constructor automatically call हो जाता है वैसे destructor भी automatically call हो जाता है, यानि main function में, पहले हमारा function run करेगा तो क्या होगा, पहले student object बनेगी, फिर उसकी information print होगी, तो यहाँ उसकी information print हो गई, फिर जैसे ही यह main function खतम हो रहा होगा, तो compiler detect करता है, कि अच्छा, यह main function खतम हो रहा है, मतलब इसके बाद यह S1 वाली object की जो memory है, तो उस memory को deallocate कर दो, object को delete कर दो memory से, तो delete करने के लिए destructor call होगा, तो उसने print करवा दिया, hi, I delete everything, तो जब हम खुद destructor नहीं बनाते, automatically destructor बनता है, और destructor को हमें अलग से call नहीं करना पड़ता, वो automatically call होता है, depending upon कब हमारा object out of scope जाता है, मतलब code के अंदर कब हमारे object की ज़रूरत नहीं पड़ती, अब destructor के अंदर, सिर्फ हमारी जो normal memory है, normal variables, ये free होते हैं, pointer वाली, जो new वाली, dynamically allocated memory है, इसको free करने के लिए हमें क्या करना पड़ता है, इसको free करने के लिए हमें लिखना पड़ता है delete CGPA PTR, कि CGPA pointer जिस memory की तरफ point कर रहा है, उस occupied memory को free कर दो, तो ये extra step है, जिसको हमें लेने की ज़रूरत होती पर वैसे तो क्योंकि यहाँ पर अपना जब हम DSA पढ़ रहे होते हैं, जब हम OOPS पढ़ रहे होते हैं, तो हम C++ की single file use कर रहे होते हैं, और generally हम किसी code editor में use कर रहे होते हैं, जैसे Visual Studio Code हो गया है, कोई और code editor अगर आपके पास है, तो यहाँ पर क्या होता है, automatically जैसे ही आपका इसलिए इने interviews में पूछा जाता है कि destructor की knowledge हमें properly है या नहीं है, क्योंकि अगर dynamically allocated memory को हमने अलग से ये delete keyword लिखके free नहीं किया, तो कई सारे issues आ सकते हैं, one of them is memory leak, memory leak का मतलब है कि कई सारी memory आपने heap के अंदर बना बना के छोड़ दी, अब उस memory की तरफ कोई pointer point भी नहीं कर र ही हमारी approach होनी चाहिए and that is why destructors become important next हम बात करने वाले हैं about the concept of inheritance inheritance is one of the four pillars of hoops inheritance वैसे day to day life में हमने observe की होगी हमारे जो parents होते हैं वो क्या करते हैं वो हमारी qualities pass on करते हैं to us तो parent क्या करता है अपनी जो qualities होती हैं वो child को pass on करता है इस process को हम in general English के अंदर क्या कहते हैं inheritance कह देते हैं और इसी concept को C++ के अंदर भी inheritance बोलते हैं basically अगर एक class let's suppose this is a class A अगर अपनी properties पास कर रही है to some other class B तो हम कहते हैं class B क्या कर रही है class A से चीज़ें inherit कर रही है inherit का मतलब होता है लेना, विरासत, तो class A के अंदर जो भी properties होंगी, वो class B के अंदर properties आ जाएंगी, और इस तरीके से जब inheritance होती है, तो उसमें class A को generally हम अपनी parent class बोलते हैं, या फिर इसे हम अपनी base class बोलते हैं, और class B को या तो हम अपनी child class बोलते हैं, या फिर इसे derived class बोलत are passed on to the derived class, तो इस तरीके से जब चीज़ें हो रही होती हैं, तब हम inheritance को use करते हैं, अब inheritance को use क्यूं किया जाता है, inheritance को use किया जाता है for code reusability, code reusability कहने का मतलब है, for example, class A के अंदर कोई property है, integer x, वही property class B के अंदर भी use होती है, अब उसको दुबारा बनाने की बजाए, हम क्या करें, उस property को directly inherit कर लें, class A से, अब यहाँ पे तो मैंने integer x बहुत चोड़ा सा example लिया, पर companies के अंदर बहुत बड़ी-बड़ी classes होती हैं, अब बहुत सारी properties का code आप बार-बार-बार-बार तो इसलिए logically inheritance बहुत important होती है for code reusability.

कि एक बार आपने code लिख लिया, अब उस code को हम directly reuse कर रहे हैं, उसे दुबारा यहाँ पर लिखने की ज़रूरत नहीं है, तो इसका एक example देखते हैं, let's suppose हमने एक class create की person, person यानि कोई भी इंसान, अब हर इंसान का एक नाम होगा, हर इंसान की एक age होगी, तो इसके लिए हमने क and we'll also get age, तो this string is equal to this name, is equal to name, and this age is equal to age, तो यह हमारी proper पूरी की पूरी person class create हो गई, अब हम एक और class बनाना चाहते है student class, हमारी student class के अंदर हमें क्या क्या properties चाहिए, एक तो हमें student का नाम चाहिए, एक हमें student की age चाहिए, एक हमें student का role number चाहिए, अब हमें पता चलेगा student का नाम और age तो already हम ऊपर define कर चुके हैं, तो हमें दुबारा तो as such define करने की ज़रूरत नहीं है, हम तो सिर्फ extra role number define कर देंगे, और person को क्या करेंगे, inherit कर लेंगे, तो person को inherit करने के लिए, मतलब दूसरी class को inherit करने के लिए, हम लिख देंगे colon, और यहा यहाँ पे access modifier किस तरीके से काम कर रहा होता है मतलब यहाँ पे हमने क्यों public लिखा उसके बारे में अभी हम detail में पढ़ेंगे पर basically हमारे different different modes होते है inheritance के कि आप private mode में inherit करना जाते हो public में करना जाते हो protected में हम भी public mode में inherit करना जाते हैं अपनी person class की properties को in our student class तो इससे क्या होगा यह हमारे लिए student class में आ जाएंगी, अब हमें name और age define करने की ज़रूरत नहीं है, वो वहाँ पे already है, हम सिर्फ role number define करेंगे, और एक बार के लिए क्या करते हैं, एक बार के लिए इसका यह वाला जो constructor है, इसे हटा के एक simple constructor जो है, उसे create करते हैं, let's suppose this is a simple constructor जो person class के अंदर है, अब यह कुछ parameterize नहीं है, तो student class के अंदर अब क्या करेंगे, student class के अंदर भी कुछ public property define कर देंगे, यह हमारा एक, रोल नंबर हो सकता है और एक function define कर देंगे get info, student का जो get info function है उसमें एक तो student का नाम print करवाएंगे, तो एक तो हो जाएगा name, एक यहाँ पर हम student के लिए उसकी age print करवाएंगे, तो यह हो जाएगी age, and एक उसका role number print करवाएंगे, तो यह हो जाएगा student का role number, अब यहाँ चीज फिर भी हम name और age को get info के अंदर access करेंगे और कोई error नहीं आएगा, तो main function के अंदर student की एक object बनाते हैं, student s1, और student s1 के लिए s1.name is equal to, let's suppose राहूल, and s1.age is equal to 21, and s1.roll number is equal to 1234, इस तरीके से हमने information define कर दी, अब s1 के लिए get info को call करते हैं, let's save it, and execute, यहाँ semicolon missing था, semicolon लगा लेते हैं, तो क्या हुआ कोई error नहीं आया सारी की सारी चीज़ें वैसे ही work कर गई even though student class के अंदर हमने कोई name और age नाम की properties नहीं define की तो student class ने क्या किया इसने person से उन properties को inherit कर लिया और अब इसके जो functions हैं वो ऐसे treat करेंगे जैसे name और age इसी की properties हैं क्योंकि वो actually अब इसी की properties बन चुकी ह तो हमारी parent class की सारी properties अब हमारी child class के अंदर भी exist करती है and जब भी inheritance हो रहा होता है और हम child class की object बनाते हैं जैसे for example if we try to create an object of B class B class की अगर हम कोई object बनाएंगे तो सबसे पहले क्या होता है सबसे पहले base class का constructor call होता है उसके बाद हमारी derived class का constructor call होता है इस चीज़ को हम verify भी कर सकते हैं जैसे अपनी derived class का एक constructor बनाते हैं student और इसे कह देते हैं यह derived की जगह see out child constructor और इसी तरीके से एक और person के अंदर already हमने constructor बनाया हुए तो यहाँ simply see out कर देंगे parent constructor, तो verify भी करते हुए देखेंगे, constructors तो automatically call होते हैं, तो let's clear this and rerun the code, तो सबसे पहले क्या हुआ, जैसे ही student class की हमने यहाँ पे object बनाने की कोशिश की, वैसे हम student class के अंदर आए, student class के अंदर यह constructor call होने से पहले, तो पहले person को create करो, तो student से पहले क्या बनेगा, person बनेगा, तो parent class का constructor call हुआ, उसके बाद हम अपने student class के, यानि अपने child class के constructor के अंदर आए, तो constructor कौन से sequence में, कौन से order में call होते हैं, ये भी एक काफी important interview question है, जब भी inheritance होती है, पहले parent class का constructor call होता है, फिर child class का constructor call होता है, और destructor में opposite होता है, जब तो पहले child class की memory डियालोकेट होती है, फिर parent class की memory डियालोकेट होती है, और इस चीज को आप दोनों classes के constructor बना कर verify भी कर सकते हैं, यहाँ पर एक बार pause करना है, दोनों classes के destructors बनाने है, destructors में लिखना है, child destructor, parent destructor, और फिर देखना है कि जब main function खतम होगा, तो किस का destructor पहले constructor है वो एक parameterized constructor है parameterized constructor कहने का मतलब है person के अंदर इस तरीके का constructor नहीं है person के अंदर इस तरीके का normal constructor है तो parameterized constructor automatically तो call होते हैं क्योंकि उन्हें compiler नहीं नहीं बनाया उन्हें तो इंसान ने बनाया प्रोग्रामर ने हमने बनाया है तो ऐसे constructor को कौन call करेगा ऐसे constructor को हम call करते है basically before our own constructor student अपने वाले constructor से पहले हम क्या करेंगे इस तरीके से colon करके हम यहाँ अपनी parent class का नाम लिखते हैं मतलब person और उसके अंदर हम properties pass कर देते हैं कि string pass कर दो name and int pass कर दो age तो इस तरीके से हमारे constructor के चलने से पहले person class का constructor call हो जाएगा with these values और हम अपने लिए तो अपनी value रखी सकते हैं, कि let's suppose अगर student के पास ये तीनो values आई थी, तो इनके साथ क्या करना है, एक हमारी name value हो गई, एक हमारी age value हो गई, और एक हमारी role number value हो गई, तो role number को तो हम यही assign कर देंगे, इसका role number will be equal to role number, और role number से पहले, name और age को हम person class के constructor के पास बेज देंगे, तो इस तरीके से हम खुद explicitly parent class के constructor को भी call लगा सकते हैं, रखते हैं फ्रॉम आर ओन चाइड कंस्ट्रक्टर अब यहां पर यह सारी जो वाल्यूज है इन्हें ऐसे लिखने की जरूरत नहीं है हम बेसिकली एसवन को जब डिफाइन करेंगे वहीं लिख देंगे स्टूडेंट का नाम तो राहुल कुमार है तो इसे हमें रन करना है यहां पर क्योंकि हम कंस्ट्रक्टर को कॉल करें तो हमें ऐसे बेजने की जरूरत नहीं है constructor को call करेंगे तो उसे values ही pass करनी है, type तो हम लिखते हैं नहीं, values pass करनी है, type तो हम कहां लिखते हैं, जब हम function को define कर रहे हूं, यहां तो हम function को call कर रहे हैं, constructor को explicitly, let's run our code and इस तरीके से हमारा code बिल्कुल सही तरीके से work कर गया है, so this is what the basics of inheritance look like, यहां पर तो हमने जो inheritance देखी, व एक होता है private mode, एक होता है protected mode, एक होता है public mode basically base class, base class मतलब हमारी जो parent class है उस parent class के अंदर अगर कोई भी private member है तो वो कभी inherit नहीं होता private properties और private functions कभी inherit नहीं होते तो private के लिए चाहे उन्हें आप private mode में inheritance कर रहे हो, protected में कर रहे हो चाहे public mode में inheritance हो रहा हो private members are never inherited Public members जो होते हैं, वो हर case में inherit होते हैं, मतलब public अगर आपका कोई भी property है, तो public mode में, derived class के अंदर, child class के अंदर, वो property public बन जाएगी, protected mode में वो property protected बन जाएगी, और private mode में वो property private बन जाएगी, basically अगर यहां mode हमने private कर दिया होता, तो यहाँ पे यह जो हमारा string और age public है, यह इस class में आके private बन जाते हैं, और उस case में अगर हम यहाँ पर main function के अंदर see out करने की कोशिश करते हैं, s1.name, तो यहाँ s1.name में parenthesis नहीं आएगा, तो इसे execute करते हैं, तो यहाँ हमारे पास error आ जाता है, कि constrained by private inheritance, कि person की जो properties हैं, उन् basically अगर हमारे पास कोई private property है जिसे हम inherit कराना चाहते हैं कहीं और access नहीं देना चाहते class के बाहर बस inherit कराना चाहते हैं दूसरी classes में तो इन private properties को हम protected बना देते हैं यही मतलब होता है protected का, सिफ inheritance के लिए pass करना है इन्हें, और कुछ काम नहीं करवाना है तो इन्हें protected बना दो, तो जितनी भी protected properties होती हैं, उन्हें अगर public mode में pass करें तो वो protected रहती हैं, protected mode में pass करें तब भी protected रहती हैं, और private mode में अगर pass करें तो वो भी private बन जाती हैं, तो जि साथ के साथ जो उन classes की derived classes होती हैं, वो भी access कर सकती हैं, चाहे आपने किसी भी mode के अंदर inheritance क्यों ना perform किया हो, अब ये तो हो गए modes of inheritance, इसके अलावा there are also types of inheritance, first type of inheritance होता है single inheritance, जब हम एक parent class से एक base class के अंदर properties को pass on करते हैं, जैसे हमने क्या किया, अभी हमने अपनी person class बनाई तो अभी जो हमने example देखा यहाँ पे person and student का, this example was an example of single level inheritance या simply single inheritance, इसके अलावा second type of inheritance होती है multi level inheritance, जिसमें बहुत सारे levels पे inheritance चल रहा होता है, जिसे for example, एक है हमारी person class, एक है हमारी student class, और एक हो गई हमारी graduate student class, ग्राजुएट स्टूडेंट अ बेसिकली लाइक एमटेक्स टूडेंट पीज टूडेंट जो एडिशनली कुछ ना कुछ पढ़ा भी रहे होते हैं तो पर्सन के अंदर प्रॉपर्टीज आ गई नेम इसके अलावा हमारे पास एज आ गई स्टूडेंट के पास अपना रोल तो it will look something like this, कि ये तो हमारी person class है, ये constructor यहां से अटा देते हैं, ये हमारी student class है, जो person class की properties को inherit कर रही है, और public mode में inherit कर रही है, तो इस student class के पास सिर्फ एक चीज एक्स्ट्रा है क्या, rule number, तो ये हमारी person class हो गई, ये person class की properties inherit करती student class हो गई, और ये हमारी एक और class हो गई, ग्राड student जो किसकी properties inherit कर रही है जो public mode में student की properties inherit कर रही है, अब student के पास person की properties तो थी, तो person की और student की दोनों की properties अब grad student में आ गई, let us correct this spelling, ग्राड student के पास एक और extra property है, which is basically string, research area, तो इस class ने इस class को properties भेजी, और इस class ने अपनी सारी properties, grad student class को भेजी, अब अगर हम grad student class की एक object बनाएंगे, grad student S1, S1 के लिए, let's suppose we define the name, to be Tony Stark, ठीक है, S1 के लिए, research area, let's suppose it's going to be, maybe quantum physics is the research area, and अगर हम c out करवा रहे हैं s1.name, and c out करवा रहे हैं s1.research area, तो ये दोनो values, we have to put a semicolon here, ये दोनों values हमारे लिए ठीक तरीके से print होकर आ जाएंगी, even though grad student के अंदर हमने कोई name नाम की property define नहीं की, और इसने तो student से inherit किया है, पर student के पास कहां से आई, student के पास person class से आई, तो इस तरीके से multiple level पर भी हमारा inheritance काम करता है, next type of inheritance है multiple inheritance, multiple inheritance तब होता है जब एक child class, दो parent class की properties को inherit करता है, जैसे for example there is a class called student, student के पास अपना role number है, student के पास अपना नाम है, there is a class called teacher, teacher के पास अपना subject है कि वो teacher कौन सा subject पढ़ाते हैं, plus उनकी कुछ salary है, अब जेनरिली हमारे colleges के अंदर, वैसे तो Indian colleges में as such TAs नहीं होते, पर हमारे जो M.Tech या PhD students होते हैं colleges के अंदर, उनको वो कभी-कभी हमें subject पढ़ाने आते हैं, I don't know about other colleges, पर हमारे college में जो M.Tech या PhD students होते थे, वो कभी-कभी पढ़ाने आते थे, तो उनका एक specific subject भी होता था, औ दोनों की properties inherit करते हैं तो इस तरीके से inheritance हम कैसे कर सकते हैं पहले तो इसके लिए student class बना लेते हैं So this is a normal student class, जिसमें एक तो हमारे पास name आ गया, और एक हमारे पास rule number आ गया, इसी तरीके से हम एक normal class बनाएंगे, हमनी teacher class, teacher के पास क्या क्या है, teacher के पास एक तो है subject, तो public ही रखते हैं सारी चीजों को for simplicity, एक तो string आ गई subject, और एक teacher के पास salary हो सकती है, तो double type की we have a salary, तो अगर TA class बनानी है तो इसमें अगर हम दोनों values को inherit करना चाते हैं तो हम लिखते हैं कि public mode में हमें student को inherit करना है comma public mode में ही हम teacher को inherit करना चाते हैं तो अलग-अलग classes का हमें अलग-अलग mode of inheritance बताना पड़ता है और सबको हम comma से separate करके लिखते हैं तो TA class student class से भी inherit कर रही है और teacher class से भी properties inherit कर रही है और TA के पास अपनी हम कह रहे हैं as such कोई property नहीं है ये बस इनी दोनों classes की properties लेती है इस तरीके से हम TA बना सकते हैं, let's try to create a TA here, TA T1, T1 का name हो जाएगा again Tony Stark, and T1 का जो subject है, वो हो जाएगा maybe engineering, even though engineering is not a single subject, let's see out TA.name, and इसी तरीके से see out कर देंगे TA.subject, save कर दिया, clear कर देते हैं, run कर देते हैं, तो values हमारे लिए normally print हो गई, कोई error नहीं आया, मतलब चीज़ें ठीक work कर गई, तो यहाँ पे ये क्या है, this is an example of multiple inheritance, next type of inheritance is hierarchical inheritance, hierarchical inheritance में, एक ही parent class से multiple child classes inherit कर रही होती हैं, जैसे for example person class है, हर इंसान का अपना नाम होता है, अब एक होगा student जिसके पास role number extra आ जाएगा और एक होगा teacher जिसके पास subject extra आ जाएगा पर person तो दोनों ही रहेंगे तो दोनों क्या कर सकते हैं person की properties को inherit कर सकते हैं this is going to be very simple to write class बनाएंगे person classes के नाम हमेशा capital letter से हम रखते हैं, for consistency, कोई as such rule नहीं होता, but for consistency, generally, almost हर language के अंदर, सारी नहीं, but majority languages के अंदर, classes के नाम capital ही रखे जाते हैं, तो string name हो गया, integer age हो गया, student class के अंदर, हमारे पास rule number हो गया, और student class क्या कर रही है, public mode में person को inherit कर रही है, teacher class क्या कर रही है, public mode में person को inherit कर रही है, teacher के पास उसके subject हो गया, तो this is basically an example of hierarchical inheritance, इसके लिए हम अपनी teacher या student या person किसी भी class की object बना कर उसको verify भी कर सकते हैं, next type of inheritance होती है हमारी hybrid inheritance, hybrid inheritance is basically जहां पे कुछ भी चल रहा होता है, मतलब सारे type के inheritance का यह mix है, for example हमारे पास person class है, person class से student ने properties inherit की, और teacher ने properties inherit की अब student से जो grad student है वो properties inherit कर रहा है और student और teacher दोनों की properties को एक TA नाम का जो class है वो inherit कर रही है तो यह क्या हो गया mix of all categories हो गया तो this is basically hybrid hybrid inheritance कह देते हैं इसे और इस चीज़ को आप चाहें तो implement कर सकते हैं although it's not going to be very difficult जो अभी तक हमने पढ़ा है यह सब उसका mix है अब next हम बात करने वाले हैं about the third pillar of OOP which is called polymorphism and polymorphism is a really interesting concept in OOPs, polymorphism का मतलब होता है, it's made up of two words poly and morph, poly का मतलब होता है multiple, बहुत सारे, morph का मतलब होता है forms, बहुत सारी forms, यानि जब हमारी object के पास ability होती है, कि वो different forms के अंदर act कर सकती है, different forms के अंदर behave कर सकती है, depending on the context, that is called polymorphism, इसका सबसे classical example, जो हम already देख चुके हैं, is constructor overloading, हमने क्या कर दिया? over loading, हमने क्या किया, एक ही class के अंदर दो constructor define कर दिये, जैसे let's clear all of this, and let's create a very simple class called student class, student class के अंदर दो constructor define कर लेते हैं, public रखते हैं दो को, पहले तो इसका student का सिर्फ name define करते हैं, एक constructor हो गया student का, यह non-parameterized constructor, इसमें c out भी करवा देते हैं, non-parameterized constructor, meterized constructor, और यहां लिख देते हैं student, और इस constructor के अंदर हमारा name आएगा, and इससे हम कहे देंगे this name is equal to name, यह कौन सा constructor हो जाएगा हमारा, इसमें c out कर देते हैं, parameterized constructor, तो हमने क्या किया, दो constructors बनाए, और दोनों का नाम same है, तो जब हम main function के अंदर, student class की एक object बनाएंगे, student, S1, तो यहाँ पे कैसे पता चलेगा, कि कौन सी class का constructor call होना चाहिए, basically अगर आपने कोई parameters नहीं दिये, तो यहाँ automatically क्या होगा, non-parameterized constructor call होगा, उसके लिए देख भी लेते हैं कैसे, okay, I have defined name string, it should be string name, non-parametrized constructor call हुआ, पर अगर यहाँ parameters ले लेंगे, Tony Stark ले लिया मैंने, इसे run करेंगे, तो इस बार parameterized constructor call होगा, तो depending upon the context, context मतलब use कैसे किया जा रहा है, उसके basis पर हमारी object अपनी form change कर सकती है, हमारी object decide कर सकती है कि कौन सा constructor call होगा, तो इसे हम कहते है constructor overloading, which is an example of polymorphism, तो polymorphism में यही हो रहा है तो generally, कि आप multiple चीज़ें define करते हैं, multiple चीज़ों के same नाम होते हैं, पर फिर भी हमें पता चल जाता है कौन सा वाला call होगा, क्यूं, क्यूंकि internally context बहुत जादा matter करता है, तो polymorphism दो type का होता है, एक होता है compile time polymorphism, एक होता है run time polymorphism, compile time polymorphism में compile time पे ही पता चल जाता है, कि output क्या आने वाला है, run time polymorphism में run time पे decide होता है, जैसे compile time polymorphism का ही एक example है, constructor, overloading, जो basically अभी हमने सीखा, अब सबसे पहले compile time polymorphism को पढ़ेंगे, फिर runtime polymorphism को पढ़ेंगे, compile time polymorphism का एक example तो देखी लिया, दूसरा example होता है function overloading, जैसे constructor overloading में हम दो constructors बना रहे थे, दोनों के नाम क्या थे, दोनों के नाम same थे, दोनों के parameters क्या थे, दोनों के parameters अलग थे, मतलब दोनों में difference का था, parameters में difference था, वैसे ही function overloading का मतलब होता है कि एक ही class के अंदर, single class के अंदर, आप दो functions अगर define करें, और दोनों functions के नाम same होने चाहिए, बस उनके अंदर parameters अलग हों, यहाँ पे एक parameter हो सकता है, दूसरे में zero हो सकते हैं, तो parameters अलग कब होते हैं, जब number of parameters different होते हैं, या तो आप number different कर दो, या आप type different कर दो, number different कर दोगे, तब भी अलग होते हैं, अलग हो जाएंगे, type different कर दोगे, तब भी अलग हो जाएंगे, तो तब क्या होता है, तब हमारे पास implement हो जाता है, function overloading, तो function overloading जब कोई पूछता है आपसे, what is function overloading, function overloading is an example or an implementation of compile time polymorphism, compile time polymorphism कैसे होता है, compile time polymorphism statically होता है, compile time पे ही हो जाता है, and function overloading is when we are defining two or more functions with the same name in the same class, but they only differ in terms of their parameters, return type same भी हो सकता है, return type different भी हो सकता है, उससे फरक नहीं पड़ता, फरक पड़ता है सिर्फ हमारे parameters से, तो इसका एक example देखते हैं, for example, हम अपने लिए create करते हैं, एक class called print, हमारी print class का काम क्या है, हमारी print class का काम है, चीज़ें print करवाना, यह integer को भी print करवा देगी, यह character को भी print करवा देगी, यह boolean value को भी print करवा देगी, तो इस print class के अंदर हमने दो functions बनाई, एक हमारा show function है, let's call it void show, जो क्या करता है, integer x लेता है, और cout show करवा देता है basically, show करने का मतलब है, उसे print करवा देता है, यहां लिख देते है integer, और यहां लिख देते हैं अपना x, और ऐसा ही हमने एक और function बनाया, उसका नाम भी show रखेंगे, पर वो क्या करता है, वो basically character लेता है, character ch, और ये क्या करता है, ch को show करवाता है, अब वैसे तो print के अंदर दोनों functions का same नाम है, पर क्योंकि दोनों के parameters अलग हैं, एक में parameter है x, एक में parameter है character, तो जब हम print class की object बनाएंगे, print p1, और p1 के लिए show को call करेंगे with let's suppose some value 101, तो वो automatically compile time पे ही detect हो जाएगा कि हमारे लिए ये वाला function call होने वाला है, क्योंकि context क्या है, usage क्या है, integer का usage है, तो integer वाला function call होगा, यहीं पर अगर character का usage होता, for example, our character was ampersand, तो यहाँ पे character ampersand print हो जाता, तो depending upon the context, same चीज क्या कर रही है, same चीज different forms ले रही है, तो इसी चीज को polymorphism कहा जाता है, और polymorphism की जो direct definition है, जो यहाँ पर लिखी हुई है, वो आपको याद करके जाने अपने interviews के लिए, तो compile time polymorphism के हमने दो examples discuss कर लिए, one was constructor overloading, one was function overloading, इसी तरीके से एक और example होता है, operator overloading, operator overloading में क्या होता है, basically same operator को multiple तरीके से use किया जाता है, for example, int x is equal to y, और y भी कोई integer था, is equal to 10, तो हम कह सकते हैं x के अंदर 10 ही value आ गई होगी तो ये operator equal to कहां use हुआ, ये operator equal to हमारी इस integer के लिए use हुआ पर हम strings को भी लिख सकते हैं, string a is equal to b अगर b कोई string है b is equal to a, b, c तो अब a के अंदर भी क्या value आ गई a के अंदर भी a, b, c value आ गई जो हमारी string library होती है, जिसको हम import करते हैं यहाँ वो internally क्या करती है, वो internally इस equal to sign को overload करती है, इसके अंदर एक extra functionality add करती है, कि equal to का मतलब string के लिए, क्या है, कि इस string की एक copy बना दो, value की इस string के अंदर, तो यहाँ पे भी overloading चल रही है, बाकि properly भी आप operator overloading कर सकते हैं C++ के अंदर, उसके अंदर जादा deep dive नहीं जाएंगे, यह म Two examples are sufficient for compile time polymorphism. पर अगर आपको और जादा deep में जाके पढ़ना है, तो you can read up more about operator overloading in C++. Generally अगर आप एक plus operator को, या एक multiply operator को, किसी भी एक operator को overload करके देख लोगे, the concept will become really really clear.

Second type of polymorphism होता है run time polymorphism. Run time polymorphism, basically dynamic polymorphism कहा जाता है इसको, और ये run time पे implement होता है. इसका सबसे classical example है function overriding overloading और overriding दोनों में differences कई बार पूछ लिये जाते हैं overloading में क्या था? एक ही class के अंदर हम दो functions बना रहे थे overriding is dependent upon inheritance overriding जहां आ गया है वहाँ आपके दिमाग में आना चाहिए inheritance overriding का मतलब होता है जब parent और child both contain the same function with the different implementations, इस बार parameters वगेरा सब कुछ same हो सकता है, बस implementation different होनी चाहिए, क्योंकि अब एक parent class है, एक child class है, यहाँ पे भी वही function होगा, यहाँ पे भी function वही होगा, तो depending upon आपने कौन सी class की object बनाई है, उसके basis पे decide होगा कि कौन से वाला function call होना चाहिए, और वो run time पे decide होता है, तो इस case में हम कहते हैं, generally हमारी जो parent class होती है और हमारी child class होती है, तो generally अगर आप child class की object बनाते हैं, तो child class का function call ���ोता है, और parent class की object बनाते हैं, तो parent class का function call होता है, तो इस case में हम कहते हैं, कि parent class का जो function है, वो overridden हो गया है, parent class के function को child class का function override कर लेता है, override करने का मतलब है, इसकी ज़्यादा priority होती है, child class के लिए, child class के function की ही ज़्यादा priority होती है, let's create a class called parent, ये तो हो गई parent class, let's clear this, parent class के अंदर एक, let's suppose there is a function called show, show function क्या करता है, show function कुछ नहीं करता है, print करवाता है parent class, and there is a class called child class, या show की जगह, we can call it get info, ये क्या करता है, ये child class, parent class को publicly inherit करता है, तो ये parent को publicly inherit कर रहा है, और इस child class के अंदर भी अपना एक get info नाम का function है, और इसका जो get info function है, वो child class print करवाता है, अब हमने main function के अंदर क्या किया, main function के अंदर, child class C1 की एक object बनाई, और C1 के लिए फिर हमने get info को call किया, तो C1 के लिए जब हम get info को call करते हैं, यहाँ पर void extra add कर लेते हैं, दोनों functions name के आगे, तो C1 के लिए जब हम get info को call करते हैं तो हमारे पास print हो जाता है child class, तो इस case में क्या हो रहा है, इस case में child class का यह जो function है, यह base class के parent class के इस function को override करता है, वहीं पर यहाँ पर अगर हम parent class बनाते P1, और P1 के लिए getInfo call करते, तो यहाँ पे क्या होता, parent class का getInfo call हो जाता, तो इस तरीके से हम function overriding को implement करते हैं, जब हमारी parent class and child class दोनों के पास same नाम का same ही function होता है, but different implementation होती है, अब runtime polymorphism का ही एक और second example है हमारे virtual functions, कुछ special functions होते हैं, जिनको हम virtual function मना सकते हैं, किसी भी function के ना virtual functions are basically member functions जिने आप expect करते हो कि derived class inheritance के बाद इने दुबारा define करेगी तो let's suppose हम कोई function मना सकते हैं void hello और ये function क्या करता है ये function c out करता है hello from parent इस चार्ट बी फ्रॉम और इसे बस वर्चुअल बनाने के लिए हम लिख सकते हैं वर्चुअल अब क्योंकि हमने इसे वर्चुअल बना दिया तो अब हमारी एक्सपेक्टेशन यह होगी कि चाइल्ड क्लास इसे री इंप्लिमेंट करें री इंप्लिमेंट करने के लिए क� तो हमारा ये वाला function call होगा, यहाँ पर आ जाएगा hello from child, तो हमारे virtual functions की कुछ-कुछ properties होती हैं, virtual functions are एक तो dynamic in nature, they are defined by the keyword virtual inside a base class, and they are always declared with a base class and overridden in a child class, base class में ही virtual लिखते हैं, child class में normally function को लिखते हैं, a virtual function is called during run time, compile time में नहीं, इसे run time में ही call किया जाता है, तो ये कुछ-कुछ special properties हैं, जो virtual functions के लिए हम याद रख सकते हैं, तो यहाँ पर हमने अपने polymorphism को complete कर लिया है, हमने compile time polymorphism देखा, function overloading, constructor overloading, operator overloading, और हमने run time polymorphism देखा, with function overriding and virtual functions, next concept जिसे हम पढ़ने वाले हैं, इसका नाम है abstraction, और abstraction के code हम already लिख चुके हैं, वो abstraction का था क्या, abstraction is, hiding all unnecessary details and showing only the important parts abstraction को implement करने का सबसे असान तरीका होते हैं हमारे access modifiers access modifiers हम क्या करते हैं जो unnecessary detail है, unnecessary detail या sensitive detail जो हमें hide करना है उसे तो हम private बना देते हैं और जो important चीज़े हैं जो उनको हम दिखाना चाहते हैं उन्हें हम public बना देते हैं, और जो private रखना चाहते हैं, पर जिन्हें inherit करना चाहते हैं, उन्हें हम protected बना देते हैं, तो access modifiers are one of the ways of implementing abstraction, जब हम किसी भी class के अंदर access modifier को use करते हैं, मतलब हम abstraction को implement कर रहे हैं, abstraction का मतलब सिर्फ sensitive information को hide करना नहीं होता, उसका मतलब यह भी होता है कि important चीज़ें दिख भी रही हूँ, तो जैसे हमने पहले term पड़ी थी data hiding, data hiding के लिए हम private को use करते हैं, तो data hiding और abstraction में difference क्या है, कि data hiding तो सिर्फ hide करता है, abstraction hide भी करता है और important चीजों को दिखाता भी है, तो access modifiers या access specifiers इनको बोल सकते हैं, they are a way of implementing abstraction, there is also one more way of implementing abstraction, वो होती है हमारी abstract classes, हमारी कोई भी अगर हमने class लिखी है न, इस तरीके से, let's suppose class A, तो उसके आगे अगर हम abstract keyword लिख देते हैं, तो यह एक abstract class बन जाती है, अब abstract class क्या होती है, abstract का English के अंदर मतलब होता है एक खयाल, तो यह एक ऐसी class है जो बस एक खयाल है, खयाल कहने का मतलब है, class का असली काम होता है objects को create करना, पर abstract class कभी कोई object create नहीं जैसे for example, एक normal class क्या होती है, normal class से different different objects create होती है, यह object 2 हो गई, यह object 3 हो गई, तो class क्या करती है, एक blueprint बनती है, यह बताती है code को कि objects कैसी दिखनी चाहिए, उनके अंदर क्या properties होनी चाहिए, क्या member functions होनी चाहिए, और एक abstract class क्या करती है, एक abstract class सिर्फ inheritance के लिए बनाई जाती है ये बस बताती है कि दूसरी classes कैसी होनी चाहिए, ये जो classes हैं, जो abstract class को inherit करती हैं, इनके अंदर कौन-कौन सी properties होनी चाहिए, कौन-कौन से functions इनके अंदर implement होनी चाहिए, तो abstract class is like a blueprint for other classes that are going to implement it, तो abstract class की कुछ-कुछ properties होती हैं, abstract classes are used to provide a base class from which other classes can be derived, एक base class बन जाती है, abstract class, जिससे सिफ inheritance हो रहा होता है, derived classes का, they cannot be instantiated, instantiated का मतलब है उनकी objects नहीं बन सकती, objects को ही technical term में, हम instance कहते हैं, instance शब्द जहां भी दिखे, oops के अंदर, उसका मतलब हम object कहना चाहें, and these classes are meant to be inherited, abstract classes are typically used to define an interface for derived classes, basically एक layout, एक interface, एक template, एक blueprint define करने के लिए used होती है abstract class, जैसे for example, हमने एक class बनाई shape, अब shape को, हम चाहें तो हर shape को draw करना possible होना चाहिए, पर जब तक हमें पता ही नहीं कि हमारी shape है कौन सी, कि हमें circle draw करना है, या हमें square draw करना है, या हमें rectangle draw करना है, या हमें triangle draw करना है, क्या हम किसी भी shape को draw कर पाएंगे, क्यों shape तो कुछ भी हो सकती है, तो अगर हमने कोई shape class बनाई है, तो इसका जो draw function है, वो exactly हम implement नहीं कर सकते, let's suppose हमने circle class बनाई, shape class को inherit करें और फिर इस circle के अंदर इसका यह जो draw method था इसको हम re-implement करें to draw a circle तो अगर हमारे पास circle class होगी तो हमें clearly पता होगा कि हमें circle draw करना है तो यह जो हमारी shape class है तो हम ऐसे ही shape की कोई object तो बना नहीं सकते हम circle बना सकते हैं हम square बना सकते हैं हम rectangle बना सकते हैं तो shape को हम क्या बना देंगे shape को हम abstract बना सकते हैं कि shape एक idea है कि चाहे आप circle की class बनाओ, चाहे आप square की class बनाओ, चाहे आप rectangle की class बनाओ, सारी classes में draw function होना चाहे, इसका हम code भी देख सकते हैं, तो यह हमने अपनी class बना दिये shape, अब shape class के अंदर हमें बताना पड़ेगा इस class के अंदर क्या-क्या function होने चाहे, तो इसके अंदर एक draw नाम क और हम इसे value assign कर देते हैं 0, इस line का मतलब यह है, कि हम shape class की, जितनी भी child classes होंगी, उन सब के अंदर draw नाम का एक function implemented होना चाहिए, तो उसका हमने क्या किया, यहाँ पे template बता दिया, यहाँ पे blueprint बता दिया, और यह जो function है, इसे हम pure virtual function भी कहते हैं, pure virtual function है, इसे हम कहते हैं, जिसकी value assign हो जाती है zero, और इसके साथ keyword होता है virtual, और जिस भी class के अंदर pure virtual function आ जाता है, वो क्या बन जाती है, वो automatically एक abstract class बन जाती है, अब ये class automatically एक abstract class बन गई है, मतलब अगर इस shape class की हम एक object बनाने निकलेंगे, variable type shape is an abstract class, आप abstract class की objects नहीं बना सकते, shape की object नहीं बना सकते, पर shape को दूसरी classes से inherit करा सकते हैं, जैसे circle public mode में inherit कर लेगा हमारी shape को, तो वो यहाँ पर function implement कर लेगा, void, draw, इसे implement करके हम see out कर देंगे, drawing a circle. तो यहाँ पर अब हम circle की एक object बना लेंगे c1 and c1 से call कर देंगे अपने draw function को, let's put two semicolons here, तो drawing a circle हमारे पास print हो गया कर, इसी तरीके से कल को अगर हम चाहें तो square class भी बना सकते हैं, rectangle class भी बना सकते हैं, सब के अंदर square draw कर सकते हैं, rectangle draw कर सकते हैं, पर इस class की object नहीं बना सकते हैं, क्योंकि abstract class का काम है सिर्फ एक idea देना, इसका काम है कि यह सिर्फ एक blueprint दे रही है कि कौन सी चीज़े हमारी base class के अंदर होनी चाहिए और कौन सी चीज़े हमारी base class के अंदर नहीं होनी चाहिए and last important concept जिसके बारे में अब हम बात करने वाले हैं यह है static keyword static एक काफी important keyword होता है जो C++ hoops के अंदर use होता है बार बार use हो रहा होता है static को हम दो तरीके से use कर सकते हैं या तो इसे हम variables के साथ use कर सकते हैं या फिर हम अपनी objects को static बना सकते हैं कोई भी variable अगर function के अंदर static बनता है तो उस function के लिए वो variable एक ही बार create होता है, और एक ही बार initialize होता है, for the lifetime of the program, for example, let's create a simple function, void func, void func के अंदर हम क्या करेंगे, अपने normal function, यह इसे fun कह देते हैं, normal function fun के अंदर हमने एक integer बनाया, x is equal to 2, और हम हर बार क्या कर रहे हैं, या x is equal to 0 कर लेते हैं, और हम हर बार c out कर रहे हैं x को, और फिर x को कर रहे हैं plus plus, तो यहाँ पर कर देते हैं कि x की value अभी क्या है, उस चीज को हम c out कर रहे हैं, अब fun को अगर हम एक बार call करें, तो हमारे पास क्या print होगा, x 0 है, तो x की value भी क्या होगी, 0 ही होगी, फिर वो 1 हो जाएगा, पर फिर हम दुबारा अगर इस function को call करें, या let's suppose हमने इस function को call किया three times, एक बार call किया, तीन बार call किया, तो हर बार output same ही आएगा, 0 ही आएगा, क्योंकि जैसे जैसे हम function को call कर रहे हैं, वैसे ही क्या हो रहा है, हमारा call stack जो होता है, उसके अंदर हमारा fun function आ रहा है, उसके लिए x variable create हो रहा है 0, फिर वो दुबारा delete हो रहा है, फिर दुबारा उसको call कर रहे है, fun function x is equal to 0, फिर दुबारा delete हो रहा है, फिर द� तो एक magical चीज होती है, क्या magical चीज होती है, अब ये x यहाँ पे create नहीं हो रहा, ये x अलग से create हो रहा है, और अब चाहे ये function call यहाँ से हट जाए, पर ये x memory के अंदर रहेगा, और आप दुबारा अगर function को call लगाएंगे, तो इस बार इस x के अंदर plus 1 होके value 1 हो जाएगी, statement है यह बार बार run हो रहा था इस बार यह initialization initialization वाली जो statement है यह एक ही बार run करेगी और बाकी सारा code बार बार run करेगा तो एक बार memory के अंदर x is equal to 0 create हो गया fun को call किया तो x की 0 value हो गई फिर x को plus plus करके हमने 1 कर दिया फिर दुबारा fun को call किया फिर x को print करवाया तो वो 1 print हो गया फिर 2 हो गया फिर दुबारा fun को call किया फिर x को print करवाया, तो वो 2 print हो जाएगा, और उसकी value internally 3 हो जाएगी, तो इसको हम होते हुए भी देख सकते हैं, x is equal to 0, x is equal to 1, 2, क्योंकि इस बार x बार बार destroy नहीं हो रहा, इस बार x एक बार बन गया, तो वो तब तक, lifetime of the program तक memory के अंदर persist करता है, और static variable, अगर हम class के अंदर किसी variable को static बना देते हैं, तो they are shared by all of the objects of the class, अभी के लिए, तो let's suppose, अगर हमने class बनाई है a, class a के अंदर, अभी अगर हम कोई variable बनाते है, int x, और इसके अंदर function बनाते है, increment x, increment x क्या करता है, x की value increase कर देता है by 1, यह करता है increment x, तो a class का अगर हम कोई object बनाए, यह object क्या कर रहा है, यह object से हम c out कर रहे हैं अपने x की value को, तो let us see out object.x, फिर हमने object के लिए call किया increment x को, और दुबारा see out कर दी x की value, तो हमारे x की value normally update हो जाएगी, x की value पहले 0 होगी, फिर 1 होगी, तो इस तरीके से update हो जाएगी, okay, we have to initialize it with 0, तो object.x की garbage value है अभी, इसको 0 से initialize कर देंगे, पहले वो 0 print हो जाएगी, फिर वो increase हो जाएगी, फिर वो 1 print हो जाएगी, अब यहाँ पर A की object 1 के साथ हमने क्या किया, एक object 2 भी create कर दिया, यहीं पर A का object 2 हम create कर देते हैं, और हम क्या कर रहे हैं, object 1 के लिए हमने x की value रख दिया 100, and object 2 के लिए हम x की value रख रहे हैं 200, तो ज� normally यहाँ पे object 2 के लिए, हमारे पास value print होनी चाहिए 200, object 1 की value print करवाएंगे, वो print होनी चाहिए 100 के equal, तो इस तरीके से normal चीज़ें चलेंगी, तो normally जितने भी हमारे properties होती हैं, अगर हमने एक object बनाई, object 1, तो इसके लिए x अलग से बनेगा, अगर हमने बनाई object 2, तो इसका x अ x एक अलग variable होता है, जो अलग से create होता है, और सारी objects उस x को share करती है, तो जब भी हम x के अंदर कुछ updations करते हैं, 100 का 200 बनाते हैं, 200 का 100 बनाते हैं, तो वो सारी objects के अंदर reflect करता है, जिन भी objects को basically code के अंदर हम static बनाते हैं, वो lifetime of the program तक exist करती हैं, तो generally जो object होती है, वो अपन ABC class के अंदर एक हमारा constructor है एक हमारा destructor है तो एक हो गया हमारे पास ABC, C out कर देते हैं constructor and इसी से एक यहाँ पर आ गया हमारे पास destructor अब अगर ABC class की हम एक object बनाते हैं object को कहां बनाया, इस object को यहां बनाने की जगे, हम क्या करेंगे, if true, तो इस object को हम यहां create करते हैं, ABC class की एक object को हमने यहाँ create किया, तो अभी normally क्या होगा, यहाँ पे object create होगी, फिर cout करेंगे हम, end of main function, तो if block के अंदर, अगर object create होती है, तो जैसे ही हम if block से बाहर निकलने जाएंगे, हमारी object delete भी हो जाएगी, तो पहले object construct हो रही, फिर destructor को call की जाएगी, फिर हमारा main function end करेगा, तो normal cases में, let's save it, and run, तो normal cases में पहले constructor आया, फिर destructor आया, फिर end of main function, लेकिन अगर हम यहाँ पर इस object को create करते हैं with the static keyword उस case में क्या होगा, उस case में पहले constructor आया, फिर main function खतम हुआ, फिर हमारे destructor को call गई, मतलब जो भी object आप static keyword के साथ create करेंगे, वो lifetime of the program और जब तक हमारा main function यानि program पूरा खतम नहीं हो जाता तब तक वो हमारी memory के अंदर persist करेगी तो इस तरीके से हमारे static keyword का usage होता है in three different conditions इसके अलावा अगर आप और deep में जानना चाहते हैं you want to explore more concepts in OOPS तो there is also this concept of friend function and friend class जिसको app as a homework problem जाकर पढ़ सकते हैं वैसे generally friend function, friend class उतने ज़ादा interviews के अंदर नहीं पूछा जाता है, and generally it becomes a slightly difficult topic to understand for some students, तो इसलिए इसको हम cover नहीं कर रहे हैं, क्योंकि interview point of view से उतनी ज़ादा companies इसे नहीं पूछती हैं, पर आप definitely अगर आपका interest आ रहा है उप्स के अंदर, तो I hope कि आज का जो हमारा पूरा को पूरा lecture था, हमने बहुत सारे different concepts सीखे, हमने बहुत सारी नई चीज़ें सीखी, जो भी आपको best part लगा, you can let me know, कि this was the best part and this was the time when we got to learn something new, तो वो चीज़ I think as a teacher सभी को अच्छी लगती है, इसके साथ में जितने भी MCQs हैं, इस पूरे chapter पर based जितने भी oops के MCQs हैं, उन्हें जाकर अब हमें solve कर लेना है, सारी चीज़ों के properly notes बनाने हैं, definitions को याद रखना है, examples आप याद रख सकते हैं, नहीं तो खुद के examples भी create कर सकते हैं, interviews के लिए अगर जितना OOPS हमने अभी cover किया है उतना आप अच्छे से cover कर लेते हैं तो आप completely तैयार हैं OOPS के interviews के लिए इतने ही concepts के साथ हमारी majority of the questions cover हो जाएंगे बस हर concept आपको अच्छे से समझ में आना चाहिए तो I hope कि आज के lecture में हमें बहुत सारी नई चीज़ें सीखने को मिली हूँ and all the best for your internship as well as placement interviews till then keep learning and keep exploring