प्रौद्योगिकी साझेदारी

वर्गाः विषयाः च (भागः १) २.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

पूर्वस्मिन् अध्याये वयं संक्षेपेण वर्गानां वस्तुनां च काश्चन अवधारणाः उक्तवन्तः अधुना, तान् मिलित्वा समीक्षयामः ।

वर्गपरिभाषा

वर्ग परिभाषा प्रारूप

class इति परिभाषितवर्गस्य कीवर्डः, तदनन्तरं परिभाषितवर्गस्य नाम, {} वर्गस्य मुख्यशरीरः, तदनन्तरं ";", वर्गे परिभाषिताः सदस्यकार्याणि पूर्वनिर्धारितरूपेण (inline) विस्तारितानि भवन्ति

अभिगम योग्यता

एकं एन्कैप्सुलेशन प्रारूपं, यत् त्रयः प्रकाराः विभक्ताः सन्ति: सार्वजनिकः, निजीः, संरक्षितः च अभिगम-अनुमति-व्याप्तिः तस्मात् स्थानात् आरभ्यते यावत् अग्रिमः अभिगम-योग्यता प्रकटितः न भवति at } अर्थात् वर्ग।

class domain

वर्गः नूतनं व्याप्तिम् परिभाषयति ।

निम्नलिखितम् अस्ति फीचर-चलच्चित्रम्///

उदाहरणम्

कल्पना

• वर्गप्रकारस्य उपयोगेन भौतिकस्मृतौ वस्तुनिर्माणस्य प्रक्रियां वर्गदृष्टान्तीकरणं कथ्यते ।
• वर्गः कस्यचित् वस्तुनः अमूर्तं वर्णनं भवति यत् एतत् केवलं वर्गस्य सदस्यचरानाम् सीमां करोति
इदं घोषणापत्रम् अस्ति तथा च कोऽपि स्थानः आवंटितः नास्ति यदा वर्गस्य उपयोगेन वस्तुनः उदाहरणं भवति तदा एव स्थानः आवंटितः भविष्यति ।
• एकः वर्गः बहुविधवस्तूनाम् उदाहरणं दातुं शक्नोति ।

एकस्मिन् वाक्ये सारांशतः : यदा वस्तुनि वर्गैः सह उदाहरणानि भवन्ति तदा एव स्थानं आवंटयिष्यति (यथा रेखाचित्रैः सह गृहस्य निर्माणं स्थानं गृह्णीयात्) ।

  1. class Date
  2. {
  3. public:
  4. void Init(int year, int month, int day)
  5. {
  6. _year = year;
  7. _month = month;
  8. _day = day;
  9. }
  10. void Print()
  11. {
  12. cout << _year << "/" << _month << "/" << _day << endl;
  13. }
  14. private:
  15. // 这⾥只是声明,没有开空间
  16. int _year;
  17. int _month;
  18. int _day;
  19. };

उपर्युक्तसङ्केते निजीचराः केवलं परिभाषिताः सन्ति तथा च नूतनं स्थानं न उद्घाट्यते;

  1. // Date类实例化出对象d1和d2
  2. Date d1;
  3. Date d2;

द्वौ नूतनौ वस्तुनि दृष्टान्तौ भवतः, अतः नूतनं स्थानं उद्घाट्यते ।

स्मृतिसंरेखणस्य नियमाः

परिभाषा

• प्रथमः सदस्यः संरचनातः 0 इति पता-अवक्षेपे भवति ।
• अन्यसदस्यचराः तेषु पतेषु मैप् करणीयाः ये निश्चितसङ्ख्यायाः (लघुगणकम्) पूर्णाङ्कगुणकाः सन्ति ।
• टिप्पणी: लघुगणकम् = संकलकस्य पूर्वनिर्धारित लघुगणकस्य लघुः सदस्यस्य आकारः च ।
• VS इत्यस्मिन् पूर्वनिर्धारितं लघुगणकं 8 अस्ति
• संरचनायाः कुल आकारः अस्ति: अधिकतमयुग्मवारसङ्ख्यायाः (सर्वचरप्रकारेषु बृहत्तमः तथा च लघुतमः पूर्वनिर्धारितयुग्मनपैरामीटर्) पूर्णाङ्कगुणकः
• यदि कश्चन संरचना नेस्टेड् भवति तर्हि नेस्टेड् संरचना तस्य अधिकतम लघुगणकस्य पूर्णाङ्कगुणकस्य, संरचनायाः समग्र आकारस्य च संरेखणं करोति
इदं सर्वेषां बृहत्तमानां लघुगणकानाम् (नेस्टेड् संरचनानां लघुगणकानाम्) पूर्णाङ्कगुणकः अस्ति ।

एतत् वयं C भाषायां जानीमः निम्नलिखितप्रश्नान् उदाहरणरूपेण गृह्यताम्।

  1. // 计算⼀下A实例化的对象是多⼤?
  2. class A
  3. {
  4. public:
  5. void Print()
  6. {
  7. cout << _ch << endl;
  8. }
  9. private:
  10. char _ch;
  11. int _i;
  12. };

तत्र कोऽपि फंक्शन् आहूतः नास्ति, अतः केवलं सदस्यचराः पश्यन्तु _ch एकः char वर्णप्रकारः अस्ति, यस्य आकारः 1 बाइट् अस्ति _i एकः int प्रकारः अस्ति, यस्य आकारः 4 बाइट् अस्ति alignment number, अतः इदं _ उपस्क्रिप्ट् 0 इत्यनेन सह स्थाने ch स्थापयन्तु, त्रीणि रिक्तस्थानानि त्यजन्तु, ततः _i पर्यन्तं 0 तः 7 पर्यन्तं कुलम् 8 बाइट्स् स्थानं गृह्णाति, यत् अधिकतमस्य alignment number इत्यस्य पूर्णाङ्कगुणकं भवति .

किं च यदि एतौ प्रश्नौ स्तः ?

  1. class B
  2. {
  3. public:
  4. void Print()
  5. {
  6. //...
  7. }
  8. };
  9. class C
  10. {
  11. };

वयं ज्ञातुं शक्नुमः यत् B वर्गे रिक्तं फंक्शन् अस्ति तथा च C क्लास् मध्ये सदस्याः नास्ति C भाषायां वयं द्वयोः वर्गयोः 1 बाइट् स्थानं गृह्णामः ।

अयं सूचकः

कल्पना

ate क्लास् मध्ये Init तथा ​​Print इति सदस्यकार्यद्वयं भवति ततः यदा d1 Init तथा ​​Print इति आह्वयति
फंक्शन् मुद्रयन् कथं ज्ञायते यत् d1 ऑब्जेक्ट् अभिगन्तुं कर्तव्यम् अथवा d2 ऑब्जेक्ट् अभिगन्तुम्?ततः अत्र वयं पश्यामः यत् C++ ददाति
एकः अन्तर्निहितः अयं सूचकः अत्र समस्यायाः समाधानं करोति
• संकलकस्य संकलनस्य अनन्तरं, वर्गस्य सदस्यकार्यं पूर्वनिर्धारितरूपेण औपचारिकपैरामीटर् इत्यस्य प्रथमस्थाने वर्तमानवर्गप्रकारस्य सूचकं योजयिष्यति, यत् एतत् सूचकं इति कथ्यते यथा, Init of Date class इत्यस्य वास्तविकं प्रोटोटाइप् अस्ति, void Init(Date* const this, int year,
int मासः, int दिवसः) २.
• यदा कस्यचित् वर्गस्य सदस्यफलकेषु सदस्यचरानाम् अभिगमनं भवति तदा तेषां अभिगमनं अनिवार्यतया this pointer इत्यस्य माध्यमेन भवति उदाहरणार्थं, यदा Init फंक्शन् इत्यस्मिन् _year इत्यस्मै मूल्यं नियुक्तं भवति तदा this-
&gt;_वर्ष = वर्ष;
• C++ इत्यनेन निर्धारितं यत् एतत् सूचकं वास्तविकमापदण्डानां औपचारिकमापदण्डानां च स्थाने स्पष्टतया लिखितुं न शक्यते (संकलनकर्ता संकलनस्य समये एतत् सम्पादयिष्यति), परन्तु एतस्य सूचकस्य उपयोगः कार्यशरीरे स्पष्टतया कर्तुं शक्यते

उदाहरणतया

  1. class Date
  2. {
  3. public:
  4. // void Init(Date* const this, int year, int month, int day)
  5. void Init(int year, int month, int day)
  6. {
  7. // 编译报错:error C2106: “=”: 左操作数必须为左值
  8. // this = nullptr;
  9. // this->_year = year;
  10. _year = year;
  11. this->_month = month;
  12. this->_day = day;
  13. }
  14. void Print()
  15. {
  16. cout << _year << "/" << _month << "/" << _day << endl;
  17. }
  18. private:
  19. // 这⾥只是声明,没有开空间
  20. int _year;
  21. int _month;
  22. int _day;
  23. };
  24. int main()
  25. {
  26. // Date类实例化出对象d1和d2
  27. Date d1;
  28. Date d2;
  29. // d1.Init(&d1, 2024, 3, 31);this指针
  30. d1.Init(2024, 3, 31);
  31. // d1.Init(&d2, 2024, 7, 5);
  32. d2.Init(2024, 7, 5);
  33. //不能自己写
  34. return 0;
  35. }

Init फंक्शन् इत्यस्मिन् वास्तविकपैरामीटर् लेखनार्थं C++ फंक्शन् इत्यस्य प्रथमे चरमध्ये अदृश्यं नित्यं this pointer (यत् परिवर्तनं कर्तुं न शक्यते) योजयिष्यति, यथा फंक्शन् इत्यस्मिन् टिप्पण्यां दर्शितम् अस्ति

सूचना:

यावत् शून्यसूचकः विसन्दर्भितः नास्ति तावत् कोऽपि दोषः न निवेदितः भविष्यति ।

  1. class A
  2. {
  3. public:
  4. void Print()
  5. {
  6. cout << "A::Print()" << endl;
  7. }
  8. private:
  9. int _a;
  10. };
  11. int main()
  12. {
  13. A* p = nullptr;
  14. p->Print();
  15. return 0;
  16. }

यद्यपि p एकं शून्यसूचकं नियुक्तं भवति तथा च Print फंक्शन् प्रति सूचितं भवति तथापि तत् dereferenced न भवति, अतः अत्र कोऽपि त्रुटिः न निवेदिता भविष्यति तथा च एषः कार्यक्रमः:

  1. class A
  2. {
  3. public:
  4. void Print()
  5. {
  6. cout << "A::Print()" << endl;
  7. cout << _a << endl;//这个地方多了一句
  8. }
  9. private:
  10. int _a;
  11. };
  12. int main()
  13. {
  14. A* p = nullptr;
  15. p->Print();
  16. return 0;
  17. }

पूर्वप्रोग्रामेन सह तुलने केवलमेकं अधिकं वाक्यं cout &lt;&lt; _a &lt;&lt; endl अस्ति, परन्तु अस्मिन् समये शून्यसूचकः सदस्यचरं प्रति सूचयति, शून्यसूचकः च सन्दर्भहीनः भविष्यति, अतः कार्यक्रमः त्रुटिं निवेदयिष्यति

वर्गस्य पूर्वनिर्धारितं सदस्यकार्यम्

कल्पना

पूर्वनिर्धारितं सदस्यकार्यं सदस्यकार्यं भवति यत् उपयोक्त्रा स्पष्टतया कार्यान्वितं न भवति तथा च संकलकेन स्वयमेव उत्पद्यते । कस्यचित् वर्गस्य कृते यदि वयं तत् न लिखामः तर्हि संकलकः पूर्वनिर्धारितरूपेण निम्नलिखित 6 पूर्वनिर्धारित सदस्यकार्यं जनयिष्यति, ये निम्नलिखितम् 6 सन्ति

कन्स्ट्रक्टर्

परिभाषा

कन्स्ट्रक्टर् एकं विशेषं सदस्यफंक्शन् अस्ति एतत् ज्ञातव्यं यत् यद्यपि कन्स्ट्रक्टर् इत्यस्य नाम कन्स्ट्रक्टर् इति उच्यते तथापि कन्स्ट्रक्टर् इत्यस्य मुख्यं कार्यं वस्तुनिर्माणार्थं स्थानं न उद्घाटयितुं भवति (प्रायः वयं यत् स्थानीयं वस्तु उपयुञ्ज्महे तत् स्तम्भस्य समये भवति frame is created) ), तस्य स्थाने वस्तुनः उदाहरणं कृत्वा वस्तु आरभ्यते । सारः अस्ति यत् initialization Init फंक्शन् प्रतिस्थापयितुं शक्यते ।

गुणाः

शीर्ष पञ्च विशेषताः

1. फंक्शन् नाम क्लास् नाम इव भवति।
2. न रिटर्न् वैल्यू। (शून्यं लिखितुं आवश्यकता नास्ति)
3. यदा वस्तु उदाहरणं भवति तदा प्रणाली स्वयमेव तत्सम्बद्धं कन्स्ट्रक्टर् आह्वयिष्यति ।
4. निर्मातृणां अतिभारः भवितुम् अर्हति।
5. यदि वर्गे स्पष्टतया परिभाषितः कन्स्ट्रक्टर् नास्ति तर्हि C++ कम्पैलर स्वयमेव पैरामीटर्-रहितं डिफॉल्ट् कन्स्ट्रक्टर् जनयिष्यति एकवारं उपयोक्ता स्पष्टतया परिभाषितवान् चेत् कम्पैलरः तत् न जनयिष्यति ।

प्रथमानि पञ्च वस्तूनि तुल्यकालिकरूपेण सरलाः सन्ति, उदाहरणं ददामः ।

  1. class Date
  2. {
  3. public:
  4. //1.⽆参构造函数,无需写void
  5. Date()//若不写,则构造函数会写出这一中无参构造函数
  6. {
  7. _year = 1;
  8. _month = 1;
  9. _day = 1;
  10. }
  11. //2.全缺省构造函数
  12. Date(int year = 1, int month = 1, int day = 1)
  13. {
  14. _year = year;
  15. _month = month;
  16. _day = day;
  17. }
  18. private:
  19. int _year;
  20. int _month;
  21. int _day;
  22. }
  23. int main()
  24. {
  25. Date d1;//此时相当于已经自动调用了Init函数
  26. Date d2;
  27. return 0;
  28. }

प्रोग्राम् मध्ये द्वौ कन्स्ट्रक्टर् लिखितौ स्तः, एकः पैरामीटर्-रहितः कन्स्ट्रक्टर् अपरः पूर्ण-डिफ़ॉल्ट् कन्स्ट्रक्टर् अस्ति यदा वयं फंक्शन् न लिखामः तदा प्रोग्राम् एकं पैरामीटर्-रहितं कन्स्ट्रक्टर् यावत् लिखति तथापि वयं पूर्वं उक्तवन्तः द्वौ कार्यौ अतिभारितौ कार्यौ स्तः, अस्पष्टतायाः आह्वानस्य कारणात्, कार्यद्वयं एकस्मिन् समये अस्तित्वं न प्राप्नुयात् ।

उत्तरद्वयं लक्षणम्

6. Parameterless constructors, full default constructors, तथा च compiler द्वारा पूर्वनिर्धारितरूपेण उत्पन्नाः constructors यदा वयं constructor न लिखामः तदा सर्वे default constructors इति उच्यन्ते तथापि एतेषु त्रयेषु कार्येषु एकमेव विद्यते, न च युगपत् विद्यते । यद्यपि पैरामीटर्रहितः कन्स्ट्रक्टर् पूर्णः पूर्वनिर्धारितः कन्स्ट्रक्टर् च फंक्शन् ओवरलोडिंग् इति निर्मान्ति तथापि तान् आह्वयति समये अस्पष्टता भविष्यति । ज्ञातव्यं यत् अनेके छात्राः मन्यन्ते यत् पूर्वनिर्धारितनिर्माता संकलकेन उत्पन्नः पूर्वनिर्धारितः निर्माता च पूर्णतया पूर्वनिर्धारितनिर्माता च सन्ति parameters इति पूर्वनिर्धारितनिर्माणम् इति उच्यते ।

6

षष्ठं विशेषता अधिकं जटिलं भवति: पैरामीटर्रहितः कन्स्ट्रक्टर्, पूर्णः डिफॉल्ट् कन्स्ट्रक्टर्, तथा च यदा वयं कन्स्ट्रक्टर् न लिखामः तदा पूर्वनिर्धारितरूपेण कम्पाइलर् द्वारा उत्पन्नः कन्स्ट्रक्टर् सर्वे पूर्वनिर्धारित् कन्स्ट्रक्टर् इति उच्यन्ते, तथा च केवलं एकः एव भवितुम् अर्हति Must not Understand the पूर्वनिर्धारितरूपेण संकलकेन उत्पन्नस्य कन्स्ट्रक्टरस्य रूपेण default constructor!

7


7. यदि वयं तत् न लिखामः तर्हि पूर्वनिर्धारितरूपेण संकलकेन उत्पन्नस्य कन्स्ट्रक्टर् इत्यस्य अन्तः निर्मितप्रकारस्य सदस्यचरस्य आरम्भस्य आवश्यकता नास्ति अन्येषु शब्देषु, तस्य आरम्भः अस्ति वा न वा इति अनिश्चितं भवति, तत् संकलकस्य उपरि निर्भरं भवति . कस्टम् टाइप सदस्यचरानाम् कृते, अस्य सदस्यचरस्य पूर्वनिर्धारितं कन्स्ट्रक्टर् आह्वयितुं आवश्यकम् अस्ति । यदि अस्य सदस्यचरस्य पूर्वनिर्धारितनिर्माता नास्ति तर्हि त्रुटिः निवेदिता भविष्यति यदि वयम् अस्य सदस्यचरस्य आरम्भं कर्तुम् इच्छामः तर्हि समस्यायाः समाधानार्थं आरम्भसूचीं विस्तरेण व्याख्यास्यामः .

विनाशकः

कल्पना

विध्वंसकस्य कार्यं कन्स्ट्रक्टर् इत्यस्य विपरीतम् अस्ति यथा, स्थानीयवस्तुनः स्तम्भचतुष्कोणः भवति यदा कार्यं समाप्तं भवति तथा च स्तम्भचतुष्कोणः नष्टः भवति released अस्माकं तस्य नियन्त्रणस्य आवश्यकता नास्ति C++ stipulates that objects यदा नष्टं भवति तदा डिस्ट्रक्टर् स्वयमेव आहूयते यत् ऑब्जेक्ट् मध्ये संसाधनानाम् सफाईं विमोचनं च पूर्णं भवति । विध्वंसकस्य कार्यं वयं पूर्वं Stack मध्ये कार्यान्वितस्य Destroy कार्यस्य सदृशं भवति यथा, Date मध्ये Destroy नास्ति अतः कठोररूपेण वक्तुं शक्यते यत् Date इत्यस्य destructor इत्यस्य आवश्यकता नास्ति destructor इत्येतत् Destroy फंक्शन् इव अस्ति यत् एतस्य उपयोगः दत्तांशसंरचनानां कृते करणीयः येषु संसाधनानाम् आवेदनाय अस्थानीयवस्तूनाम् यथा stacks तथा queues इत्यादीनां आवश्यकता भवति ।

गुणाः

1. विध्वंसकनामस्य पूर्वं वर्गनामस्य पूर्वं ~ इति वर्णः भवति । (C भाषायां bitwise negation इत्यस्य सदृशम्)
2. न पैरामीटर्स् न च रिटर्न् वैल्यू। (एतत्संरचनासदृशं, शून्यं योजयितुं आवश्यकता नास्ति)
3. कस्यचित् वर्गस्य केवलम् एकः विध्वंसकः भवितुम् अर्हति । यदि स्पष्टतया परिभाषितं न भवति तर्हि प्रणाली स्वयमेव पूर्वनिर्धारितं विध्वंसकं जनयिष्यति ।
4. यदा वस्तुजीवनचक्रं समाप्तं भवति तदा प्रणाली स्वयमेव विध्वंसकं आह्वयिष्यति ।
5. कन्स्ट्रक्टर् इत्यस्य सदृशं यदि वयं कम्पाइलर् द्वारा स्वयमेव उत्पन्नं डिस्ट्रक्टर् न लिखामः तर्हि इदं बिल्ट-इन् टाइप् सदस्यान् प्रोसेस् न करिष्यति Custom type सदस्याः स्वस्य डिस्ट्रक्टर्स् आह्वयन्ति ।
6. इदमपि ज्ञातव्यं यत् यदा वयं स्पष्टतया विध्वंसकं लिखामः तदा कस्टम् प्रकारस्य सदस्यस्य विध्वंसकः अपि आह्वयते अर्थात् कस्टम् प्रकारस्य सदस्यस्य विध्वंसकः स्वयमेव आह्वयते भविष्यति यद्यपि स्थितिः कापि भवतु
7. यदि वर्गे संसाधनानाम् आवेदनं न भवति तर्हि विध्वंसकस्य लेखनस्य आवश्यकता नास्ति, तथा च संकलकेन उत्पन्नं पूर्वनिर्धारितं विध्वंसकं प्रत्यक्षतया उपयोक्तुं शक्यते, यथा यदि पूर्वनिर्धारितं उत्पन्नं विध्वंसकं उपयोक्तुं शक्यते तर्हि अस्ति न प्रदर्शयितुं विध्वंसकं लिखन्तु, यथा MyQueue;
8. स्थानीयक्षेत्रे बहुविधवस्तूनाम् कृते C++ इत्यनेन निर्धारितं यत् पश्चात् परिभाषिताः प्रथमं नष्टाः भविष्यन्ति ।

विनाशकस्य प्रयोगः

उपरिष्टात् कन्स्ट्रक्टर् इव, C++ द्वारा स्वयमेव उत्पन्नः पूर्वनिर्धारितः डिस्ट्रक्टर् सामान्यतया अस्माकं कृते महतीं सहायतां न करिष्यति, परन्तु केषुचित् दुर्लभेषु सन्दर्भेषु अधिकं सुविधाजनकं भवति, यथा कतारं कार्यान्वितुं द्वयोः स्टैकयोः उपयोगः

  1. public:
  2. Stack(int n = 4)//相当于Init
  3. {
  4. _a = (STDataType*)malloc(sizeof(STDataType) * n);
  5. if (nullptr == _a)
  6. {
  7. perror("malloc fail!");
  8. return;
  9. }
  10. _capacity = n;
  11. _top = 0;
  12. }
  13. ~Stack()//相当于Destroy
  14. {
  15. cout << "~Stack()" << endl;
  16. free(_a);
  17. _a = nullptr;
  18. _top = _capacity = 0;
  19. }
  20. private:
  21. STDataType* _a;
  22. size_t _capacity;
  23. size_t _top;
  24. };
  25. class MyQueue
  26. {
  27. public:
  28. //编译器默认⽣成MyQueue的析构函数调⽤了Stack的析构,释放的Stack内部的资源
  29. // 显⽰写析构,也会⾃动调⽤Stack的析构
  30. private:
  31. Stack pushst;
  32. Stack popst;
  33. };

अस्मिन् समये MyQueue इत्यस्मिन् कम्पैलरः स्वयमेव स्टैक् इत्यस्य कन्स्ट्रक्टर् (initialization) तथा डिस्ट्रक्टर् (destruction) इत्येतत् आह्वयति ।