C ++ क्लासेस और ऑब्जेक्ट्स का परिचय

01

09 के

सी ++ कक्षाएं शुरू करना

लैपटॉप पर हाथ टाइप करते हुए
सैम एडवर्ड्स / गेटी इमेजेज़

वस्तुओं C ++ और C के बीच सबसे बड़ा अंतर है। C ++ के शुरुआती नामों में से एक था C, क्लासेस के साथ।

वर्ग और वस्तुएँ

एक वर्ग एक वस्तु की एक परिभाषा है। यह एक प्रकार की तरह है पूर्णांक. एक वर्ग जैसा दिखता है struct केवल एक अंतर के साथ: सभी संरचनात्मक सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं। सभी वर्ग के सदस्य निजी हैं।

याद रखें - एक वर्ग एक प्रकार है, और इस वर्ग का एक उद्देश्य सिर्फ एक है परिवर्तनशील.

इससे पहले कि हम किसी वस्तु का उपयोग कर सकें, उसे अवश्य बनाया जाना चाहिए। एक वर्ग की सबसे सरल परिभाषा है:

 कक्षा का नाम {

 // सदस्य

 }


मॉडल के नीचे यह उदाहरण वर्ग एक साधारण पुस्तक है। OOP का उपयोग करने से आप समस्या को समाप्त कर सकते हैं और इसके बारे में सोच सकते हैं न कि केवल मनमाने ढंग से चर।

 // उदाहरण एक

 #शामिल 

 #शामिल 


 कक्षा की किताब

 {

 int पेजकाउंट;

 इंट करंट पेजेज; 

 जनता:

 पुस्तक (int Numpages); // कंस्ट्रक्टर

 ~ बुक () {}; // विध्वंसक

 शून्य सेटपेज (इंट पेजनंबर);

 int GetCurrentPage (शून्य);

 }; 


 पुस्तक:: पुस्तक (इंट न्यूमेज्स) {

 PageCount = NumPages;
instagram viewer

 }


 शून्य पुस्तक:: सेटपेज (इंट पेजनंबर) {

 CurrentPage = PageNumber;

 }


 int बुक:: GetCurrentPage (शून्य) {

 CurrentPage लौटाएं;

 }


 मुख्य प्रवेश बिंदु() {

 बुक एबूक (128);

 एक किताब। सेटपेज (56);

 std:: cout << "वर्तमान पृष्ठ" << ABook। GetCurrentPage () << std:: endl;

 वापसी 0;

 }


से सभी कोड कक्षा की किताब के लिए नीचे int बुक:: GetCurrentPage (शून्य) { फंक्शन क्लास का हिस्सा है। मुख्य() फ़ंक्शन यह एक रनवेबल एप्लिकेशन बनाने के लिए है।

02

09 के

बुक क्लास को समझना

में मुख्य() फ़ंक्शन का एक वैरिएबल एबूक टाइप बुक वैल्यू 128 के साथ बनाया गया है। जैसे ही निष्पादन इस बिंदु तक पहुंचता है, ऑब्जेक्ट ABook का निर्माण किया जाता है। अगली पंक्ति में विधि एक किताब। पृष्ठ स्थापित करें() कहा जाता है और मान 56 को ऑब्जेक्ट चर में सौंपा गया है एक किताब। वर्तमान पृष्ठ. फिर अदालत कॉल करके इस मान को आउटपुट करता है एक किताब। GetCurrentPage () तरीका।

जब अमल पहुंचता है वापसी 0; एबूक वस्तु को अब आवेदन की जरूरत नहीं है। संकलक विध्वंसक को एक कॉल उत्पन्न करता है।

घोषित वर्ग

के बीच सब कुछ कक्षा की किताब और यह } वर्ग घोषणा है। इस वर्ग में दो निजी सदस्य हैं, दोनों प्रकार के इंट। ये निजी हैं क्योंकि कक्षा के सदस्यों की डिफ़ॉल्ट पहुंच निजी है।

जनता: निर्देश बताता है संकलक यहाँ से पहुँच सार्वजनिक है। इसके बिना, यह अभी भी निजी होगा और एबूक सदस्यों तक पहुंचने से मुख्य () फ़ंक्शन में तीन पंक्तियों को रोक देगा। टिप्पणी करने का प्रयास करें जनता: बाहर संकलन और आगामी संकलन त्रुटियों को देखने के लिए recompiling।

नीचे दी गई यह पंक्ति एक कंस्ट्रक्टर की घोषणा करती है। यह वह फ़ंक्शन है जिसे ऑब्जेक्ट पहली बार बनाया जाता है।

 पुस्तक (int Numpages); // कंस्ट्रक्टर 

इसे लाइन से बुलाया जाता है

 बुक एबूक (128); 

यह एक प्रकार की बुक नामक एक ऑब्जेक्ट बनाता है और बुक () फ़ंक्शन को कॉल करता है पैरामीटर 128.

03

09 के

बुक क्लास के बारे में अधिक

C ++ में, कंस्ट्रक्टर का हमेशा कक्षा के समान नाम होता है। जब ऑब्जेक्ट बनाया जाता है तो कंस्ट्रक्टर को कहा जाता है और वह जगह है जहां आपको ऑब्जेक्ट को इनिशियलाइज़ करने के लिए अपना कोड डालना चाहिए।

पुस्तक में विधायक के बाद अगली पंक्ति विध्वंसक है। यह कंस्ट्रक्टर के रूप में एक ही नाम है, लेकिन इसके सामने एक ~ (टिल्ड) है। किसी वस्तु के विनाश के दौरान, विध्वंसक को वस्तु को साफ करने और यह सुनिश्चित करने के लिए बुलाया जाता है कि ऑब्जेक्ट द्वारा उपयोग किए जाने वाले मेमोरी और फ़ाइल हैंडल जैसे संसाधन जारी किए जाते हैं।

याद है-एक वर्ग xyz में एक रचनाकार कार्य xyz () और विध्वंसक कार्य ~ xyz () होता है। यहां तक ​​कि अगर आप घोषित नहीं करते हैं, तो कंपाइलर चुपचाप उन्हें जोड़ देगा।

विध्वंसक को हमेशा कहा जाता है जब वस्तु समाप्त हो जाती है। इस उदाहरण में, ऑब्जेक्ट को कार्यक्षेत्र से बाहर जाने पर अंतर्निहित रूप से नष्ट कर दिया जाता है। इसे देखने के लिए, इस के लिए विध्वंसक घोषणा को संशोधित करें:

 ~ पुस्तक () {std:: cout << "विध्वंसक नामक";}; // विध्वंसक 

यह घोषणा में कोड के साथ एक इनलाइन फ़ंक्शन है। इनलाइन का दूसरा तरीका इनलाइन शब्द को जोड़ रहा है

 इनलाइन ~ बुक (); // विध्वंसक


और इस तरह एक समारोह के रूप में विध्वंसक जोड़ें।

 इनलाइन बुक:: ~ बुक (शून्य) { 

 std:: cout << "विध्वंसक कहा जाता है";

 }


इनलाइन फ़ंक्शन कंपाइलर को अधिक कुशल कोड उत्पन्न करने के लिए संकेत हैं। उनका उपयोग केवल छोटे कार्यों के लिए किया जाना चाहिए, लेकिन यदि उपयुक्त स्थानों में उपयोग किया जाता है - जैसे कि अंदर छोरों-प्रदर्शन में काफी अंतर आ सकता है।

04

09 के

लेखन कक्षा के तरीके

सर्वश्रेष्ठ प्रणालियां वस्तुओं के लिए सभी डेटा को निजी बनाना और इसे एक्सेसर फ़ंक्शंस के रूप में जाना जाता है। पृष्ठ स्थापित करें() तथा GetCurrentPage () ऑब्जेक्ट चर को एक्सेस करने के लिए उपयोग किए जाने वाले दो कार्य हैं वर्तमान पृष्ठ.

बदलाव कक्षा संरचना और recompile के लिए घोषणा। यह अभी भी संकलन और सही ढंग से चलना चाहिए। अब दो चर पृष्ठ संख्या तथा वर्तमान पृष्ठ सार्वजनिक रूप से सुलभ हैं। बुक एबूक (128) के बाद इस लाइन को जोड़ें, और यह संकलन करेगा।

 एक किताब। पेजकाउंट = 9;


यदि आप वापस संरचना बदलते हैं कक्षा और recompile, उस नई लाइन को अब संकलित नहीं किया जाएगा पृष्ठ संख्या अब फिर से निजी है।

द:: संकेतन

बुक क्लास घोषणा के निकाय के बाद, सदस्य कार्यों की चार परिभाषाएं हैं। प्रत्येक को पुस्तक के साथ परिभाषित किया गया है:: उपसर्ग के रूप में इसे पहचानने के लिए उपसर्ग।:: गुंजाइश पहचानकर्ता कहा जाता है। यह फ़ंक्शन को कक्षा का हिस्सा होने के रूप में पहचानता है। यह वर्ग घोषणा में स्पष्ट है, लेकिन इसके बाहर नहीं।

यदि आपने किसी वर्ग में सदस्य फ़ंक्शन की घोषणा की है, तो आपको फ़ंक्शन का शरीर इस तरह प्रदान करना होगा। अगर आप चाहते थे कि बुक क्लास अन्य फाइलों के द्वारा इस्तेमाल की जाए, तो आप पुस्तक की घोषणा को अलग कर सकते हैं हैडर फ़ाइल, शायद book.h. कोई अन्य फ़ाइल तब इसे शामिल कर सकती है

 # किताब "बुक.ह" 

05

09 के

वंशानुक्रम और बहुरूपता

यह उदाहरण वंशानुक्रम को प्रदर्शित करेगा। यह एक दो वर्गीय अनुप्रयोग है जिसमें एक वर्ग दूसरे से प्राप्त होता है।

 #शामिल 

 #शामिल 


 कक्षा बिंदु

 {


 int x, y;

 जनता:

 बिंदु (int atx, int aty); // कंस्ट्रक्टर

 इनलाइन वर्चुअल ~ पॉइंट (); // विध्वंसक

 आभासी शून्य ड्रा ();

 }; 


 वर्ग वृत्त: सार्वजनिक बिंदु {


 इंट रेडियस;

 जनता:

 वृत्त (int atx, int aty, int theRadius);

 इनलाइन वर्चुअल ~ सर्कल ();

 आभासी शून्य ड्रा ();

 };



 बिंदु:: बिंदु (इंट एटैक्स, इंट एट) {

 x = atx;

 y = aty;

 }


 इनलाइन प्वाइंट:: ~ प्वाइंट (शून्य) { 

 std:: cout << "प्वाइंट डिस्ट्रक्टर" कहा जाता है;

 }


 शून्य बिंदु:: ड्रा (शून्य) {

 std:: cout << "बिंदु:: ड्रा बिंदु पर" << x << "" << y << std:: endl;

 }



 वृत्त:: वृत्त (int atx, int aty, int theRadius): बिंदु (atx, aty) {

 त्रिज्या = theRius;

 }


 इनलाइन सर्कल:: ~ सर्कल () {

 std:: cout << "सर्कल डिस्ट्रक्टर" << std:: endl;

 }


 शून्य वृत्त:: ड्रा (शून्य) {

 बिंदु:: ड्रा ();

 std:: cout << "वृत्त:: ड्रा बिंदु" << "त्रिज्या" << त्रिज्या << std:: endl;

 }


 मुख्य प्रवेश बिंदु() {

 सर्कल ACircle (10,10,5);

 एक क्षेत्र में। ड्रा ();

 वापसी 0;

 }


उदाहरण के दो वर्ग हैं, प्वाइंट और सर्कल, एक बिंदु और एक सर्कल मॉडलिंग। एक बिंदु में x और y निर्देशांक हैं। वृत्त वर्ग बिंदु वर्ग से लिया गया है और एक त्रिज्या जोड़ता है। दोनों वर्गों में शामिल हैं a ड्रा () सदस्य समारोह। इस उदाहरण को छोटा रखने के लिए आउटपुट सिर्फ टेक्स्ट है।

06

09 के

विरासत

कक्षा वृत्त से लिया गया है बिंदु कक्षा। यह इस पंक्ति में किया जाता है:

 वर्ग वृत्त: बिंदु {


क्योंकि यह एक बेस क्लास (प्वाइंट) से लिया गया है, सर्किल सभी वर्ग के सदस्यों को विरासत में मिला है।

 बिंदु (int atx, int aty); // कंस्ट्रक्टर

 इनलाइन वर्चुअल ~ पॉइंट (); // विध्वंसक

 आभासी शून्य ड्रा ();


 वृत्त (int atx, int aty, int theRadius);

 इनलाइन वर्चुअल ~ सर्कल ();

 आभासी शून्य ड्रा ();


एक अतिरिक्त सदस्य (त्रिज्या) के साथ बिंदु वर्ग के रूप में सर्किल वर्ग के बारे में सोचो। यह बेस क्लास मेंबर फंक्शन और प्राइवेट वेरिएबल को इनहेरिट करता है एक्स तथा y.

यह निजी तौर पर छोड़कर इन्हें इस्तेमाल या नियत नहीं कर सकता क्योंकि ये निजी हैं, इसलिए इसे सर्किल कंस्ट्रक्टर की शुरुआती सूची के माध्यम से करना होगा। यह कुछ ऐसा है जिसे आपको अभी स्वीकार करना चाहिए। मैं भविष्य के ट्यूटोरियल में शुरुआती सूची में वापस आऊंगा।

सर्किल कंस्ट्रक्टर में, पहले theRadius को सौंपा गया है त्रिज्याप्रारंभिक सूची में पॉइंट के कंस्ट्रक्टर को कॉल के माध्यम से सर्किल के प्वाइंट पार्ट का निर्माण किया जाता है। यह सूची सब कुछ के बीच है: और {नीचे।

 वृत्त:: वृत्त (int atx, int aty, int theRadius): बिंदु (atx, aty) 


संयोग से, कंस्ट्रक्टर टाइप इनिशियलाइज़ेशन का उपयोग सभी अंतर्निहित प्रकारों के लिए किया जा सकता है।

 int a1 (10);

 int a2 = 10;


दोनों ऐसा ही करते हैं।

07

09 के

बहुरूपता क्या है?

बहुरूपता एक सामान्य शब्द है जिसका अर्थ है "कई आकार"। C ++ में बहुरूपता का सबसे सरल रूप कार्यों का अतिभार है। उदाहरण के लिए, कई कार्य कहलाते हैं SortArray (सरणी प्रकार) जहाँ एक प्रकार का हो सकता है सरणी ints या युगल.

हम केवल यहाँ बहुरूपता के ओओपी रूप में रुचि रखते हैं, हालांकि। यह एक फंक्शन बनाकर किया जाता है (जैसे ड्रा) () वास्तविक बेस क्लास प्वाइंट में और फिर उसमें ओवरराइडिंग व्युत्पन्न वर्ग वृत्त।

हालांकि समारोह ड्रा () व्युत्पन्न वर्ग में आभासी है वृत्त, यह वास्तव में जरूरत नहीं है - यह मेरे लिए सिर्फ एक अनुस्मारक है कि यह आभासी है। यदि एक व्युत्पन्न वर्ग में फ़ंक्शन नाम और पैरामीटर प्रकारों के आधार वर्ग में एक आभासी फ़ंक्शन से मेल खाता है, तो यह स्वचालित रूप से आभासी है।

एक बिंदु को खींचना और एक वृत्त खींचना केवल बिंदु और वृत्त के निर्देशांक के साथ दो बहुत अलग संचालन हैं, इसलिए यह महत्वपूर्ण है कि सही ड्रा () कहा जाता है। कंपाइलर कोड कैसे उत्पन्न करता है जो सही वर्चुअल फ़ंक्शन प्राप्त करता है, भविष्य के ट्यूटोरियल में शामिल किया जाएगा।

08

09 के

सी ++ कंस्ट्रक्टर्स

कंस्ट्रक्टर्स

एक कंस्ट्रक्टर एक फ़ंक्शन है जो किसी ऑब्जेक्ट के सदस्यों को इनिशियलाइज़ करता है। एक कंस्ट्रक्टर ही जानता है कि उसे अपनी कक्षा का ऑब्जेक्ट कैसे बनाना है।

बेस और व्युत्पन्न वर्गों के बीच कंस्ट्रक्टर्स को स्वचालित रूप से विरासत में नहीं मिला है। यदि आप व्युत्पन्न वर्ग में एक की आपूर्ति नहीं करते हैं, तो एक डिफ़ॉल्ट प्रदान किया जाएगा लेकिन यह वह नहीं कर सकता जो आप चाहते हैं।

यदि कोई निर्माणकर्ता आपूर्ति नहीं करता है, तो एक डिफ़ॉल्ट एक कंपाइलर द्वारा बिना किसी पैरामीटर के बनाया जाता है। हमेशा एक कंस्ट्रक्टर होना चाहिए, भले ही वह डिफ़ॉल्ट और खाली हो। यदि आप एक निर्माता को मापदंडों के साथ आपूर्ति करते हैं तो एक डिफ़ॉल्ट नहीं बनाया जाएगा।

निर्माणकर्ताओं के बारे में कुछ बिंदु:

  • कन्स्ट्रक्टर्स केवल क्लास के समान नाम के साथ कार्य करते हैं।
  • कन्स्ट्रक्टर्स का उद्देश्य क्लास के सदस्यों को इनिशियलाइज़ करना है जब उस क्लास का एक उदाहरण बनाया जाता है।
  • कन्स्ट्रक्टर्स को सीधे नहीं बुलाया जाता है (शुरुआती सूचकों के अलावा)
  • कंस्ट्रक्टर कभी वर्चुअल नहीं होते।
  • एक ही वर्ग के लिए कई कंस्ट्रक्टर को परिभाषित किया जा सकता है। उन्हें भेद करने के लिए उनके पास अलग-अलग पैरामीटर होने चाहिए।

उदाहरण के लिए, कंस्ट्रक्टरों के बारे में जानने के लिए और भी बहुत कुछ है, डिफॉल्ट कंस्ट्रक्टर, असाइनमेंट और कॉपी कंस्ट्रक्टर। इन पर अगले पाठ में चर्चा की जाएगी।

09

09 के

C ++ डिस्ट्रक्टर्स को बांधना

एक विध्वंसक एक क्लास मेंबर फंक्शन है जिसका नाम कंस्ट्रक्टर (और क्लास) के समान है लेकिन सामने एक ~ (टिल्ड) है।

 ~ वृत्त ();


जब कोई वस्तु गुंजाइश से बाहर जाती है या अधिक शायद ही कभी स्पष्ट रूप से नष्ट हो जाती है, तो इसका विनाशकर्ता कहा जाता है। उदाहरण के लिए, यदि ऑब्जेक्ट में पॉइंटर्स जैसे डायनामिक वैरिएबल हैं, तो उन्हें मुक्त करने की आवश्यकता है और विध्वंसक उपयुक्त जगह है।

यदि आप व्युत्पन्न वर्ग हैं, तो निर्माणकर्ताओं के विपरीत, विध्वंसक को आभासी बनाया जा सकता है। में बिंदु तथा वृत्त वर्गों का उदाहरण, विध्वंसक की आवश्यकता नहीं है क्योंकि कोई सफाई कार्य नहीं किया जाना है (यह सिर्फ एक उदाहरण के रूप में कार्य करता है)। अगर गतिशील सदस्य चर होते (जैसे) संकेत) तो उन लोगों को स्मृति रिसाव को रोकने के लिए मुफ्त की आवश्यकता होगी।

इसके अलावा, जब व्युत्पन्न वर्ग उन सदस्यों को जोड़ता है जिन्हें टिडिंग की आवश्यकता होती है, तो वर्चुअल विध्वंसक की आवश्यकता होती है। जब आभासी, सबसे व्युत्पन्न वर्ग विध्वंसक को पहले कहा जाता है, तो उसके तत्काल पूर्वज के विध्वंसक को कहा जाता है, और इसी तरह आधार वर्ग तक।

हमारे उदाहरण में,

 ~ वृत्त ();

फिर

 ~ बिंदु ();


बेस क्लास डिस्ट्रक्टर को अंतिम कहा जाता है।

इससे यह पाठ पूरा होता है। अगले पाठ में, डिफॉल्ट कंस्ट्रक्टर, कॉपी कंस्ट्रक्टर और असाइनमेंट के बारे में जानें।

instagram story viewer