2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
सामग्रीसूची
प्रक्रिया-प्रधानं वस्तु-प्रधानं च
2. वर्गप्रवेशयोग्यता तथा एन्कैप्सुलेशन
प्रक्रिया-उन्मुखः प्रोग्रामिंग् प्रक्रिया-केन्द्रितः प्रोग्रामिंग-विचारः अस्ति । प्रक्रिया-उन्मुख-प्रोग्रामिङ्ग्-मध्ये कार्यक्रमः विशिष्टकार्यं पूर्णं कर्तुं निश्चितक्रमेण निष्पादितानां कार्याणां प्रक्रियाणां वा सङ्ग्रहः इति दृश्यते ।
लाभ:
- कार्यप्रदर्शनकुशलता : यतो हि प्रक्रिया-उन्मुख-प्रोग्रामिंग् प्रत्यक्षतया प्रक्रियानुसारं कार्याणि निष्पादयति तथा च अत्यधिक-वस्तुनिर्माणस्य प्रबन्धनस्य च आवश्यकता नास्ति, अतः उच्चतर-प्रदर्शन-आवश्यकताभिः सह केषुचित् परिदृश्येषु तस्य निष्पादन-दक्षता अधिका भवति, यथा अन्तर्निहित-प्रणाली-प्रोग्रामिंग्, एम्बेडेड्-प्रोग्रामिंग् इत्यादिषु यथा, ऑपरेटिंग् सिस्टम् कर्नेल् इत्यस्मिन् प्रक्रिया-उन्मुख-प्रोग्रामिंग् इत्यस्य उपयोगः प्रक्रिया-निर्धारणं, स्मृति-प्रबन्धनम् इत्यादीनां कार्याणां कार्यान्वयनार्थं कार्यक्षमतायाः उत्तम-अनुकूलीकरणाय कर्तुं शक्यते
- स्पष्ट तर्कः : सरलकार्यक्रमतर्कस्य कृते प्रक्रियानुसारं पदे पदे कार्यान्वितं भवति कोडस्य तार्किकसंरचना स्पष्टा सुलभा च भवति, अवगन्तुं सुलभं च भवति। यथा, द्वयोः सङ्ख्यायोः योगस्य गणनां कुर्वन् सरलः प्रोग्रामः प्रक्रिया-उन्मुख-प्रोग्रामिंग् इत्यस्य उपयोगेन गणनायाः कृते कार्यं प्रत्यक्षतया परिभाषितुं शक्नोति ।
अभावः : १.
- दुर्बल परिपालनक्षमता : यदा प्रोग्रामस्य आकारः वर्धते तथा च कार्याणि जटिलानि भवन्ति तदा प्रक्रियात्मकप्रोग्रामिंग-उन्मुखः कोडः परिपालनं विस्तारं च कठिनं भवितुम् अर्हति । यतो हि विविधकार्ययोः मध्ये युग्मनं उच्चं भवति, एकस्य कार्यस्य परिवर्तनेन अन्येषां सम्बन्धिनां कार्याणां प्रभावः भवितुम् अर्हति ।
- कम कोड पुनः उपयोगिता: कोड-पुनः उपयोगः प्रायः फंक्शन्-आह्वानस्य माध्यमेन भवति, परन्तु जटिल-कार्यात्मक-मॉड्यूल्-कृते पुनः-उपयोगः अधिकः कठिनः भवति तथा च फंक्शन्-इत्यस्य सम्यक् समाहितं अमूर्तं च कर्तुं न शक्यते
वस्तु-उन्मुख-प्रोग्रामिंग् इति वस्तु-केन्द्रित-प्रोग्रामिंग-विचारः । वस्तुनि तानि सत्तानि सन्ति येषु दत्तांशः (गुणाः) तथा च तस्मिन् दत्तांशे कार्यं कुर्वन्तः पद्धतयः (व्यवहाराः) सन्ति । वस्तुनि सम्बन्धितदत्तांशं विधिं च समाहितं कृत्वा दत्तांशस्य, कार्याणां च एकीकरणं सिद्धं भवति ।
लाभ:
- उच्च परिपालनक्षमता : वस्तुषु कार्याणि समाहितं कुर्वन्तु, वस्तुनां आन्तरिकं कार्यान्वयनम् बहिः जगतः गोपयन्ति, मॉड्यूलानां मध्ये युग्मनं न्यूनीकरोति च । यदा कस्यचित् कार्यस्य परिवर्तनस्य आवश्यकता भवति तदा अन्येषां असम्बद्धानां भागानां प्रभावं विना केवलं तत्सम्बद्धस्य वस्तुनः आन्तरिकं कार्यान्वयनम् एव परिवर्तनीयम् । यथा, चित्रात्मक-अन्तरफलक-अनुप्रयोगे यदि भवान् बटनस्य कार्यं परिवर्तयितुम् इच्छति तर्हि अन्येषां अन्तरफलक-तत्त्वानां प्रभावं विना बटन-वस्तुनः तत्सम्बद्धं विधिं परिवर्तयितुं एव आवश्यकम्
- दृढं कोडपुनर्प्रयोगक्षमता : संहितापुनःप्रयोगः विस्तारश्च उत्तराधिकारः, बहुरूपता इत्यादिभिः विशेषताभिः सहजतया प्राप्तुं शक्यते ।यथा, आधारवर्गं रचयन्तु
Shape
(आकारं) ततः व्युत्पादयतिCircle
(वृत्त),Rectangle
(Rectangle) इत्यादयः उपवर्गाः, उपवर्गाः आधारवर्गस्य विशेषतानां पद्धतीनां च पुनः उपयोगं कर्तुं विशिष्टविस्तारं कर्तुं च शक्नुवन्ति ।- उत्तमं लचीलापनम्: वस्तु-उन्मुख-प्रोग्रामिंग् बहुरूपतायाः समर्थनं करोति, यत् प्रोग्रामं रनटाइम्-काले वस्तुनः वास्तविकप्रकारस्य अनुसारं तत्सम्बद्धानि पद्धतीनि गतिशीलरूपेण चयनं कर्तुं निष्पादयितुं च शक्नोति, येन प्रोग्रामस्य लचीलता, मापनीयता च वर्धते
अभावः : १.
- कार्यप्रदर्शनस्य उपरि: यतः वस्तुनिर्माणं, विधिकॉलिंग् इत्यादिषु कार्येषु निश्चितमात्रायां ओवरहेडस्य आवश्यकता भवति, अत्यन्तं उच्चप्रदर्शनस्य आवश्यकतायुक्तेषु केषुचित् परिदृश्येषु, एतत् कार्यक्रमस्य निष्पादनदक्षतां प्रभावितं कर्तुं शक्नोति
- उच्च शिक्षणव्ययः: वस्तु-उन्मुख-प्रोग्रामिंगस्य अवधारणाः विशेषताः च तुल्यकालिकरूपेण जटिलाः सन्ति, येन आरम्भकानां कृते शिक्षितुं अवगन्तुं च कठिनं भवति ।
• class इति कीवर्डः यः क्लास् परिभाषयति, Data इति क्लास् इत्यस्य नाम, {} च क्लास् इत्यस्य शरीरं भवति ध्यानं कुर्वन्तु यत् क्लास् परिभाषायाः अन्ते अनुवर्तमानं अर्धविरामं त्यक्तुं न शक्यते । वर्गस्य शरीरे विद्यमानाः सामग्रीः वर्गस्य सदस्याः इति उच्यन्ते: वर्गे चराः वर्गस्य विशेषताः अथवा सदस्यचराः इति उच्यन्ते;
• सदस्यचरानाम् भेदं कर्तुं सामान्यतया सदस्यचरस्य मध्ये विशेषपरिचयकर्तारं योजयितुं प्रथा अस्ति, यथा सदस्यचरस्य पूर्वं वा पश्चात् वा _ अथवा m इत्यनेन आरभ्यत इति ध्यानं कुर्वन्तु यत् C++ मध्ये एतत् अनिवार्यं नास्ति, केवलं केचन रूढयः सन्ति .
• C++ इत्यस्मिन् struct अपि C++ इत्यस्य उपयोगेन सह संगतम् अस्ति वर्गान् परिभाषितुं वर्गस्य उपयोगं कर्तुं अनुशंसितम् ।
• कस्मिन् अपि वर्गे परिभाषिताः सदस्यकार्यं पूर्वनिर्धारितरूपेण इनलाइन् भवन्ति ।
class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } private: // 为了区分成员变量,⼀般习惯上成员变量 // 会加⼀个特殊标识,如_ 或者 m开头 int _year; // year_ m_year int _month; int _day; }; int main() { Date d; d.Init(2024, 3, 31); return 0; }
• वर्गः नूतनं व्याप्तिम् परिभाषयति वर्गस्य सर्वे सदस्याः वर्गस्य व्याप्ते सन्ति यदा सदस्यः कस्य वर्गस्य डोमेनस्य अस्ति इति सूचयितुं ::scope ऑपरेटरस्य उपयोगः करणीयः।
• क्लास डोमेन् संकलनस्य अन्वेषणनियमान् प्रभावितं करोति यदि निम्नलिखितप्रोग्रामे Init क्लास् डोमेन् Stack निर्दिशति तर्हि संकलनकर्ता Init इत्यस्य ग्लोबल फंक्शन् इत्यस्य रूपेण व्यवहारं करिष्यति तर्हि एरे इत्यादीनां सदस्यानां घोषणा/परिभाषा न भवितुम् अर्हति found. , त्रुटिः निवेदिता भविष्यति। क्लास् डोमेन् Stack इत्यस्य निर्दिष्टीकरणस्य अर्थः अस्ति यत् Init इति सदस्यफंक्शन् अस्ति यदि वर्तमान डोमेन् इत्यत्र array इत्यादयः सदस्याः न प्राप्यन्ते तर्हि ते क्लास् डोमेन् इत्यत्र अन्वेषिताः भविष्यन्ति ।
- #include<iostream>
- using namespace std;
- class Stack
- {
- public:
- // 成员函数
- void Init(int n = 4);
- private:
- // 成员变量
- int* array;
- size_t capacity;
- size_t top;
- };
- // 声明和定义分离,需要指定类域
- void Stack::Init(int n)
- {
- array = (int*)malloc(sizeof(int) * n);
- if (nullptr == array)
- {
- perror("malloc申请空间失败");
- return;
- }
- capacity = n;
- top = 0;
- }
- int main()
- {
- Stack st;
- st.Init();
- return 0;
- }
• C++ इति एन्कैप्सुलेशनं कार्यान्वितुं एकः उपायः अस्ति, यत् वस्तुनः गुणाः विधिः च संयोजयितुं वर्गानां उपयोगेन वस्तुं अधिकं पूर्णं भवति, तथा च अभिगम-अनुमति-माध्यमेन बाह्य-उपयोक्तृभ्यः चयनात्मकरूपेण तस्य अन्तरफलकं प्रदाति
• सार्वजनिकद्वारा परिवर्तितानां सदस्यानां प्रत्यक्षतया वर्गस्य बहिः प्रवेशः कर्तुं शक्यते संरक्षिताः निजी च सदस्याः प्रत्यक्षतया अभिगन्तुं न शक्यन्ते, तेषां भेदाः पश्चात् उत्तराधिकारप्रकरणे प्रतिबिम्बिताः भविष्यन्ति।
• अभिगम-अनुमति-व्याप्तिः तस्मात् स्थानात् आरभ्यते यत्र अभिगम-योग्यता दृश्यते यावत् अग्रिमः अभिगम-योग्यता न दृश्यते यदि तदनन्तरं अभिगम-योग्यता न दृश्यते तर्हि व्याप्तिः } अर्थात् वर्गे समाप्तः भवति
• यदा वर्गपरिभाषासदस्यः अभिगमयोग्यताद्वारा परिवर्तितः न भवति तदा सः पूर्वनिर्धारितरूपेण निजीरूपेण भवति ।
• struct पूर्वनिर्धारितं सार्वजनिकं प्रति
• सामान्यतया सदस्यचराः निजी/संरक्षिताः प्रतिबन्धिताः भविष्यन्ति, तथा च सदस्यकार्यं येषां उपयोगः अन्यैः कर्तुं आवश्यकः अस्ति, ते सार्वजनिकाः भविष्यन्ति।
वस्तुप्रधानस्य त्रयः प्रमुखाः लक्षणाः : समाहितीकरणं, उत्तराधिकारः, बहुरूपता च ।
वर्ग-वस्तु-पदे वयं मुख्यतया वर्गानां एन्कैप्सुलेशन-लक्षणानाम् अध्ययनं कुर्मः अतः एन्कैप्सुलेशन् इति किम् ?
एनकैप्सुलेशन: जैविकरूपेण दत्तांशं दत्तांशसञ्चालनस्य पद्धतीश्च संयोजयन्तु, वस्तुनः गुणाः कार्यान्वयनविवरणं च गोपयन्तु, केवलं वस्तुना सह अन्तरक्रियां कर्तुं अन्तरफलकं उजागरयन्तु
एन्कैप्सुलेशन मूलतः एकप्रकारस्य प्रबन्धनम् अस्ति यत् उपयोक्तृभ्यः वर्गानां उपयोगं सुलभं करोति । यथा : सङ्गणकवत् जटिलयन्त्रस्य कृते उपयोक्त्रे केवलं पावर ऑन-ऑफ-कील, कीबोर्ड-इनपुट्, मॉनिटर, यूएसबी-जैक् इत्यादीनि एव प्रदत्तानि सन्ति, येन उपयोक्ता सङ्गणकेन सह अन्तरक्रियां कर्तुं दैनन्दिनकार्यं च सम्पन्नं कर्तुं शक्नोति परन्तु वस्तुतः सङ्गणकस्य वास्तविकं कार्यं CPU, ग्राफिक्स् कार्ड्, मेमोरी इत्यादयः हार्डवेयर घटकाः सन्ति ।
सङ्गणक-उपयोक्तृणां कृते तेषां आन्तरिक-कोर-घटकानाम् विषये चिन्ता न भवति, यथा मदरबोर्ड्-मध्ये परिपथाः कथं विन्यस्ताः, CPU-इत्यस्य डिजाइनं कथं भवति इत्यादि उपयोक्तृभ्यः केवलं सङ्गणकं कथं चालू कर्तव्यम्, कथं करणीयम् इति ज्ञातव्यम् कीबोर्ड-मूषक-माध्यमेन सङ्गणकेन सह अन्तरक्रियां कुर्वन्ति । अतः यदा सङ्गणकनिर्मातारः कारखानात् निर्गच्छन्ति तदा ते आन्तरिककार्यन्वयनविवरणं गोपयितुं बहिः एकं शेल् स्थापयन्ति, केवलं बहिः शक्तिस्विच्, मूषकं, कीबोर्डजैक् च प्रयच्छन्ति येन उपयोक्तारः सङ्गणकेन सह अन्तरक्रियां कर्तुं शक्नुवन्ति
C++ भाषायां एन्कैप्सुलेशनं कार्यान्वितुं, दत्तांशसञ्चालनार्थं दत्तांशः, पद्धतयः च वर्गानां माध्यमेन जैविकरूपेण संयोजितुं शक्यन्ते, तथा च अभिगमाधिकारस्य उपयोगः वस्तुनां आन्तरिककार्यन्वयनविवरणं गोपयितुं तथा च नियन्त्रणं कर्तुं शक्यते यत् कक्षायाः बहिः प्रत्यक्षतया केषां पद्धतीनां उपयोगः कर्तुं शक्यते इति नियन्त्रणं कर्तुं शक्यते
• क्लास् टाइप् इत्यस्य उपयोगेन भौतिकस्मृतौ वस्तुनिर्माणस्य प्रक्रियां class instantiation इति कथ्यते ।
• वर्गः कस्यचित् वस्तुनः अमूर्तं वर्णनं भवति, यत् वर्गस्य सदस्यचराः केवलं घोषिताः भवन्ति तथा च स्थानस्य आवंटनं तदा भविष्यति यदा वस्तु a श्रेणी।
• एकः वर्गः बहुविधवस्तूनाम् उदाहरणं दातुं शक्नोति । यथा : वर्गात् वस्तुनां उदाहरणं यथार्थतया गृहस्य निर्माणार्थं वास्तुशिल्पचित्रणस्य उपयोगः इव भवति डिजाइनचित्रणं कति कक्ष्याः सन्ति, कक्षस्य आकारः कार्याणि च इत्यादीनि योजनां करोति is no physical object.भवनं अस्ति चेदपि तत् जनानां मध्ये निवासं कर्तुं न शक्नोति यदा गृहं डिजाइनचित्रैः निर्मितं भवति। स एव वर्गः डिजाइन रेखाचित्रवत् भवति तथा च दत्तांशं संग्रहीतुं न शक्नोति दृष्टान्तकृतं वस्तु दत्तांशं संग्रहीतुं भौतिकस्मृतिं आवंटयति ।
वर्गवस्तुनि के सदस्याः सन्ति इति विश्लेषणं कुर्वन्तु? वर्गेन दृष्टान्तरूपेण निर्मितस्य प्रत्येकस्य वस्तुनः स्वतन्त्रः दत्तांशस्थानं भवति, अतः वस्तुनः सदस्यचराः अवश्यं सन्ति अतः सदस्यकार्याणि समाविष्टानि सन्ति वा? प्रथमं, फंक्शन् संकलितस्य अनन्तरं, एषः निर्देशानां विभागः अस्ति, यः ऑब्जेक्ट् मध्ये संग्रहीतुं न शक्यते, एते निर्देशाः पृथक् क्षेत्रे (code segment) संगृहीताः भवन्ति, अतः यदि ते ऑब्जेक्ट् मध्ये संगृहीताः भवेयुः तर्हि ते केवलं भवितुम् अर्हन्ति सदस्यकार्यं प्रति सूचकाः। पुनः विश्लेषणं कुर्मः, किं वस्तुनि सूचकानाम् संग्रहणं आवश्यकम् अस्ति? d1 तथा d2 इत्येतयोः सूचकाः समानाः सन्ति, अतः तान् वस्तुषु संग्रहणं अपव्ययः भवति । यदि भवान् 100 वस्तुनः उदाहरणार्थं Date इत्यस्य उपयोगं करोति तर्हि member function pointer 100 वारं संगृहीतः भविष्यति, यत् अत्यन्तं अपव्ययप्रदम् अस्ति । वस्तुतः फंक्शन् पॉइंटर् इत्यस्य संग्रहणस्य आवश्यकता नास्ति , न तु रनटाइम् इत्यत्र केवलं गतिशीलबहुरूपता लभ्यते, कार्यसङ्केतानां संग्रहणं च आवश्यकम् ।
उपरि वयं विश्लेषितवन्तः यत् केवलं सदस्यचराः एव वस्तुषु संगृहीताः भवन्ति C++ इत्यनेन निर्धारितं यत् वर्गैः दृष्टान्तरूपेण स्थापिताः वस्तुनः स्मृतिसंरेखणनियमानां अनुपालनमपि भवितुमर्हन्ति ।
स्मृतिसंरेखणस्य नियमाः
स्मृतिसंरेखणस्य नियमाः C भाषायाः समानाः एव सन्तिसन्दर्भलेखः १.स्मृतिसंरेखणस्य गणनां कर्तुं C भाषा
प्रथमः सदस्यः संरचनातः 0 इति पता-अवक्षेपे अस्ति ।
• अन्यसदस्यचराः तेषु पतेषु मैप् करणीयाः ये निश्चितसङ्ख्यायाः (संरेखणसङ्ख्या) पूर्णाङ्कगुणकाः सन्ति ।
• नोटः लघुगणकम् = संकलकस्य पूर्वनिर्धारितसंरेखणसङ्ख्यायाः सदस्यस्य आकारस्य च लघुः ।
•VS मध्ये पूर्वनिर्धारितं लघुगणकं 8 अस्ति
• संरचनायाः कुल आकारः अस्ति: अधिकतमसंरेखणसङ्ख्यायाः (सर्वचरप्रकारेषु बृहत्तमः तथा च लघुतमः पूर्वनिर्धारितसंरेखणमापदण्डः) पूर्णाङ्कगुणकः
• यदि कश्चन संरचना नेस्टेड् भवति तथा च नेस्टेड् संरचना स्वस्य अधिकतम लघुगणकस्य पूर्णाङ्कगुणकस्य सह संरेखिता भवति तर्हि संरचनायाः समग्रः आकारः सर्वेषां (नेस्टेड् संरचनायाः संरेखणं सहितं) सङ्ख्यायाः अधिकतमः संरेखणसङ्ख्या भवति
यदि सदस्यचरः नास्ति तर्हि १ बाइट् अवश्यं दातव्यः यतः यदि बाइट् अपि न दत्तः तर्हि कथं दर्शयितुं शक्यते यत् वस्तु अस्ति इति? अतः अत्र केवलं वस्तुनः अस्तित्वस्य स्थानधारकपरिचयार्थं १ बाइट् दत्तः ।
Date क्लास् मध्ये Init तथा Print इति द्वौ सदस्यौ कार्यौ स्तः अतः यदा d1 Init तथा Print फंक्शन् आह्वयति तदा फंक्शन् कथं जानाति यत् सः d1 ऑब्जेक्ट् अभिगन्तुं अर्हति वा इति घ२ वस्तु?ततः अत्र वयं पश्यामः यत् C++ अत्र समस्यायाः समाधानार्थं implicit this pointer ददाति ।
• संकलकस्य संकलनस्य अनन्तरं, वर्गस्य सदस्यकार्यं पूर्वनिर्धारितरूपेण औपचारिकपैरामीटर् इत्यस्य प्रथमस्थाने वर्तमानवर्गप्रकारस्य सूचकं योजयिष्यति, यत् एतत् सूचकं इति कथ्यते यथा, Init of Date वर्गस्य वास्तविकं आद्यरूपं, .void Init(Date* const this, int year, int month, int day) • क्लास सदस्यफलकेषु सदस्यचरानाम् अभिगमनसमये, तेषां अभिगमनं अनिवार्यतया अस्य सूचकस्य माध्यमेन भवति उदाहरणार्थं, यदा Init फंक्शन् मध्ये _year इत्यस्मै मूल्यं नियुक्तं भवति तदा एतत् ->_वर्ष = वर्ष;
• C++ इत्यनेन निर्धारितं यत् एतत् सूचकं वास्तविकमापदण्डानां औपचारिकमापदण्डानां च स्थाने स्पष्टतया लिखितुं न शक्यते (संकलनकर्ता संकलनस्य समये एतत् सम्पादयिष्यति), परन्तु एतस्य सूचकस्य उपयोगः कार्यशरीरे स्पष्टतया कर्तुं शक्यते
- #include<iostream>
- using namespace std;
- class Date
- {
- public:
- // void Init(Date* const this, int year, int month, int day)
- void Init(int year, int month, int day)
- {
- // 编译报错:error C2106: “=”: 左操作数必须为左值
- // this = nullptr;
- // this->_year = year;
- _year = year;
- this->_month = month;
- this->_day = day;
- }
- void Print()
- {
- cout << _year << "/" << _month << "/" << _day << endl;
- }
- private:
- // 这⾥只是声明,没有开空间
- int _year;
- int _month;
- int _day;
- };
- int main()
- {
- // Date类实例化出对象d1和d2
- Date d1;
- Date d2;
- d1.Init(2024, 7, 1); // d1.Init(&d1, 2024, 7, 1);
- d1.Print(); // d1.Print(&d1);
- d2.Init(2024, 7, 10); // d2.Init(&d2, 2024, 7, 10);
- d2.Print(); // d2.Print(&d2);
- return 0;
- }