कन्स्ट्रक्टर्, स्थिरसदस्याः, मित्राणि, आन्तरिकवर्गाः [Classes and Objects (Part 2)] इत्यस्य आरम्भसूची ।
2024-07-12
한어 Русский язык English Français Indonesian Sanskrit 日本語 Deutsch Português Ελληνικά español Italiano Suomalainen Latina
PS: VS2022 वातावरणे निम्नलिखितसङ्केतः परीक्षितः, यस्य अर्थः न भवति यत् सर्वे संकलकाः तत् पारयितुं शक्नुवन्ति।
PS: कश्चन अपि परीक्षणसङ्केतः stdio.h इति शीर्षकसञ्चिकायाः घोषणां न दर्शयति ।
ब्लोगर मुखपृष्ठ: LiUEEEEE C++ स्तम्भ ग भाषा स्तम्भ दत्तांशसंरचना स्तम्भ अल्गोरिदम् स्तम्भः क्रमबद्धः निउके इत्यस्य शास्त्रीयविषयेषु स्तम्भः
1. कन्स्ट्रक्टरस्य आरम्भसूची
१.१ कन्स्ट्रक्टर् प्रति पश्चात् पश्यन्
मम पूर्वस्मिन् ब्लोग् मध्ये
निर्माणं, विनाशः, प्रतिलिपिः [वर्गाः विषयाः च (भागः २)] । वर्गस्य कन्स्ट्रक्टर् इत्यस्य उल्लेखः अस्ति ।तिथिवर्गं उदाहरणरूपेण गृहीत्वा आरम्भविधिः निम्नलिखितरूपेण अस्ति ।
class Date
{
public :
Date ( int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private :
int _year;
int _month;
int _day;
} ;
यथा उपर्युक्ते कोड् मध्ये दर्शितं, C++ इत्यस्य अग्रे अध्ययनं विना, उपयोक्तारः सामान्यतया चिन्तयिष्यन्ति यत् कन्स्ट्रक्टर् मध्ये कोड् क्लास् मेम्बर् चरस्य आरम्भः अस्ति, परन्तु तथ्यं तस्य विपरीतम् एव C++ इत्यस्मिन् कन्स्ट्रक्टर् इत्यस्य मुख्यं कथनं केवलं इनिशियलाइज् भवति सदस्यचराः असाइनमेण्ट् इति सच्चिदानन्दरूपेण आरम्भीकरणं न वक्तुं शक्यते, यतः आरम्भीकरणं केवलं एकवारं कर्तुं शक्यते, यदा तु कन्स्ट्रक्टर् सदस्यचरानाम् मूल्यानि बहुवारं नियुक्तुं शक्नोति, उदाहरणार्थम्:
Date ( int year, int month, int day)
{
_year = year;
_year += 1 ;
}
१.२ आरम्भसूची
अस्मिन् समये C++ मध्ये आरम्भसूची प्रवर्तते ।
आरम्भसूची ":" (विराम) इत्यनेन आरभ्य "," (अल्पविरामेन) इत्यनेन पृथक्कृतानां दत्तांशसदस्यानां सूची अस्ति, तथा च कोष्ठके स्थापितं मूल्यं प्रारम्भं मूल्यं भवति, उदाहरणार्थम् : १.
Date ( int year, int month, int day)
: _year ( year)
, _month ( month)
, _day ( day)
{ }
have to be aware of इति अस्ति:
प्रत्येकं सदस्यचरं आरम्भसूचौ एकवारं एव दृश्यमानं भवितुम् अर्हति (आरम्भीकरणं केवलं एकवारं आरभ्यते) । वर्गे निम्नलिखितसदस्याः सन्ति, ये आरम्भार्थं आरम्भसूचौ अवश्यमेव स्थापनीयाः । सन्दर्भ सदस्य चर कस्टम् प्रकारस्य सदस्यचराः (तथा च कस्टम् प्रकारस्य पूर्वनिर्धारितः कन्स्ट्रक्टर् नास्ति: पैरामीटर्रहितः कन्स्ट्रक्टर्, पूर्णतया डिफॉल्ट् कन्स्ट्रक्टर्, सिस्टम् द्वारा स्वयमेव उत्पन्नः कन्स्ट्रक्टर्) const संशोधित सदस्य चर
उपरि उल्लिखितानां कस्टम् सदस्यचरानाम् (पूर्वनिर्धारितनिर्मातृणां विना) अर्थः अस्ति यत् परिभाषितस्य कस्टम् सदस्यचरस्य कन्स्ट्रक्टर् पैरामीटर्स् सहितः कन्स्ट्रक्टर् अस्ति, तथा च पैरामीटर्स् पारितस्य आवश्यकता भवति यदा उपयोक्ता कन्स्ट्रक्टर् प्रदर्शयति, यदि यदि आरम्भीकरणं भवति सूची न लिखिता अस्ति, संकलकः स्वयमेव उपयोक्तुः कृते तत् जनयिष्यति तथापि यदि कस्टम् सदस्यचरानाम् आरम्भार्थं पैरामीटर्स् इत्यस्य सहभागिता आवश्यकी भवति तर्हि प्रणाली पूर्वनिर्धारितरूपेण पैरामीटर्स् न पारयिष्यति, यस्य परिणामः अप्रारम्भः भविष्यति अप्रारम्भीकरणं परिहरितुं स्थितिः भवति अनन्तरप्रयोगे अनावश्यकक्लेशं परिहरितुं।
१.३ आरम्भसूचीविषये युक्तयः
आरम्भसूचीं लिखन्ते सति सदस्यचरानाम् आरम्भक्रमः वर्गे घोषणाक्रमेण सह सङ्गतः भवितुम् अर्हति, यतः संकलकः घोषणाक्रमानुसारं चरानाम् आरम्भं क्रमेण करोति यदि उपयोक्ता क्रमेण न लिखति तर्हि तत् कारणं भविष्यति अनावश्यकं क्लेशं यथा : १.
class A
{
public :
A ( int n)
: _a2 ( n)
, _a1 ( _a2)
{ }
void Print ( )
{
cout << "_a1 = " << _a1 << endl;
cout << "_a2 = " << _a2 << endl;
}
private :
int _a1;
int _a2;
} ;
int main ( )
{
A aa ( 100 ) ;
aa. Print ( ) ;
return 0 ;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
उपरिष्टाद् चित्रे दर्शितरीत्या आरम्भे अपेक्षाभिः सह असङ्गताः परिणामाः प्राप्ताः भविष्यन्ति, अतः तस्य उपयोगे एतादृशाः क्रियाः परिहर्तव्याः
2. स्पष्ट कीवर्ड
कन्स्ट्रक्टर् कृते अपि समर्पितं फंक्शन् अस्ति
एकल पैरामीटर् कन्स्ट्रक्टर् वा
बहुभिः पैरामीटरैः सह कन्स्ट्रक्टर् परन्तु प्रथमपैरामीटर् कृते पूर्वनिर्धारितं मूल्यं नास्ति अन्तर्निहितप्रकाररूपान्तरणम्, यथा- १.
class Date
{
public :
Date ( int year)
: _year ( year)
{ }
Date& operator = ( const Date& d)
{
if ( this != & d)
{
_year = d. _year;
_month = d. _month;
_day = d. _day;
}
return * this ;
}
private :
int _year;
int _month;
int _day;
} ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class Date
{
public :
Date ( int year, int month = 1 , int day = 1 )
: _year ( year)
, _month ( month)
, _day ( day)
{ }
Date& operator = ( const Date& d)
{
if ( this != & d)
{
_year = d. _year;
_month = d. _month;
_day = d. _day;
}
return * this ;
}
private :
int _year;
int _month;
int _day;
} ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
मूल्यं पारयित्वा नियुक्तं कुर्वन् यथा - १.
Date date ( 2024 ) ;
संकलकस्तरस्य 2024 प्रत्यक्षतया निर्मितवर्गवस्तुनि न नियुक्तं भवति, परन्तु 2024 अन्तर्निहितरूपान्तरणद्वारा अस्थायीवर्गवस्तुरूपेण परिणमति, ततः तादृशवस्तुद्वारा आरम्भं कर्तुं आवश्यकं वर्गवस्तुं प्रति नियुक्तं भवति यथा, तत् is necessary आरभितं वर्गवस्तु A अस्ति तथा च अस्थायी वर्गवस्तु B अस्ति:
Date A ( 2024 ) ;
等价于
Date A = B
अन्तर्निहितरूपान्तरणं परिहरितुं C++ इत्यनेन स्पष्टं कीवर्डं निर्मितं यत् निर्माता अन्तर्निहितरूपान्तरणं निवारयितुं शक्नोति तस्मात् पूर्वं स्पष्टं योजयितुं शक्नोति ।
explicit Date ( int year)
: _year ( year)
{ }
3. स्थिर सदस्य
३.१ स्थिर सदस्य अवधारणा
स्थिररूपेण घोषिताः वर्गसदस्याः स्थिरसदस्याः इति उच्यन्ते स्थिरसदस्यचराः स्थिरसदस्यचराः स्थिराः सदस्याः कार्याणि इति उच्यन्ते; स्थिरसदस्यचराः वर्गात् बहिः आरभणीयाः, यथा-
class Date
{
public :
Date ( int year, int month = 1 , int day = 1 )
: _year ( year)
, _month ( month)
, _day ( day)
{ }
private :
int _year;
int _month;
int _day;
static int _i;
} ;
int Date:: _i = 1 ;
३.२ स्थिरसदस्यलक्षणम्
स्थिरसदस्याः सर्वैः वर्गवस्तुभिः साझाः भवन्ति तथा च ते स्थिरक्षेत्रे संगृहीताः भवन्ति । स्थिरसदस्यचराः वर्गात् बहिः परिभाषिताः भवेयुः परिभाषयन्ते सति स्थिरकीवर्डः न योजितः भवति । वर्गस्य स्थिरसदस्यानां प्रवेशः वर्गनाम::static member अथवा object.static member इत्यस्य उपयोगेन कर्तुं शक्यते स्थिरसदस्यकार्येषु कोऽपि गुप्तः सूचकः नास्ति तथा च कस्यापि अस्थिरसदस्यस्य अभिगमनं कर्तुं न शक्नोति । स्थिरसदस्याः अपि वर्गस्य सदस्याः सन्ति तथा च सार्वजनिकैः, संरक्षितैः, निजीप्रवेशयोग्यैः च प्रतिबन्धिताः सन्ति ।
4. यूयुआन्
मित्राणि एन्कैप्सुलेशनं भङ्गयितुं मार्गं ददति, कदाचित् सुविधां च ददति । तथापि मित्राणि युग्मनं वर्धयिष्यन्ति, एन्कैप्सुलेशनं च नाशयिष्यन्ति अतः मित्राणां उपयोगः एकवारादधिकं न कर्तव्यम् ।
मित्राणि विभक्ताः सन्ति : मित्रकार्यं मित्रवर्गाः च
४.१ मित्रकार्यम्
मित्रकार्यस्य अर्थः अस्ति यत् यदा वर्गात् बहिः कस्यचित् कार्यस्य वर्गस्य निजसदस्यं अभिगन्तुं आवश्यकं भवति तदा वर्गे एतत् कार्यं वर्गस्य मित्रकार्यं इति घोषयित्वा अभिगन्तुं शक्यते, यथा-
class Date
{
friend void Print ( Date& d) ;
public :
Date ( int year = 1 , int month = 1 , int day = 1 )
: _year ( year)
, _month ( month)
, _day ( day)
{ }
private :
int _year;
int _month;
int _day;
} ;
void Print ( Date& d)
{
cout << d. _year << " " << d. _month << " " << d. _day << endl;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
मित्रकार्यं वर्गस्य निजीसुरक्षितसदस्यान् अभिगन्तुं शक्नोति, परन्तु वर्गस्य सदस्यकार्यं न मित्रकार्यं const इत्यनेन परिवर्तयितुं न शक्यते मित्रकार्यं वर्गपरिभाषायां कुत्रापि घोषितुं शक्यते तथा च वर्गप्रवेशयोग्यकैः प्रतिबन्धितं न भवति । फंक्शन् बहुवर्गस्य मित्रकार्यं भवितुम् अर्हति मित्रकार्याणां आह्वानस्य सिद्धान्तः साधारणकार्यस्य समानः एव ।
४.२ मित्रवर्गाः
यदा कश्चन वर्गः अन्यस्य वर्गस्य निजसदस्यान् अभिगन्तुं इच्छति तदा सः एतत् वर्गं तस्मिन् वर्गे मित्ररूपेण घोषयितुं शक्नोति यस्य अभिगमनं आवश्यकं भवति, ततः सः स्वस्य निजसदस्यान् अभिगन्तुं शक्नोति, यथा-
class Time
{
friend class Date ;
public :
Time ( int hour = 0 , int minute = 0 , int second = 0 )
: _hour ( hour)
, _minute ( minute)
, _second ( second)
{ }
private :
int _hour;
int _minute;
int _second;
} ;
class Date
{
public :
Date ( int year = 1900 , int month = 1 , int day = 1 )
: _year ( year)
, _month ( month)
, _day ( day)
{ }
void SetTimeOfDate ( int hour, int minute, int second)
{
_t. _hour = hour;
_t. _minute = minute;
_t. _second = second;
}
private :
int _year;
int _month;
int _day;
Time _t;
} ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
मित्रसम्बन्धाः एकदिशा अविकारी च भवन्ति । यथा, उपरि उल्लिखिते Time क्लास् तथा Date क्लास् मध्ये यदि भवान् Time क्लास् मध्ये Date क्लास् इत्यस्य friend क्लास् इति घोषयति तर्हि Date क्लास् इत्यस्मिन् Time क्लास् इत्यस्य private member चर्स् प्रत्यक्षतया अभिगन्तुं शक्नोति, परन्तु भवान् इच्छति Time क्लास् इत्यस्मिन् Date क्लास् इत्यस्य private member variables इत्यस्य अभिगमनं कुर्वन्तु । मित्रसम्बन्धः संक्रामकः न भवितुम् अर्हति यदि गः खस्य मित्रं खस्य च कस्य मित्रं भवति तर्हि गः कस्य मित्रं इति न भवति ।
5. आन्तरिकवर्गः
C++ वर्गस्य अन्तः अन्यस्य वर्गस्य निर्माणं समर्थयति, यत् आन्तरिकवर्गः इति उच्यते आन्तरिकवर्गः स्वतन्त्रः वर्गः अस्ति, तथा च आन्तरिकवर्गस्य सदस्याः बाह्यवर्गस्य वस्तुभिः प्रवेशं कर्तुं न शक्यन्ते . बाह्यवर्गस्य अन्तःवर्गस्य किमपि श्रेष्ठं प्रवेशः नास्ति ।
अन्तःवर्गः च स्वाभाविकतया बाह्यवर्गस्य मित्रं भवति अर्थात् अन्तःवर्गः बाह्यवर्गस्य निजसदस्यान् प्राप्तुं शक्नोति।
लक्षणम् : १.
आन्तरिकवर्गाः बाह्यवर्गेषु सार्वजनिकाः, संरक्षिताः, निजी वा इति परिभाषितुं शक्यन्ते । ध्यानं कुर्वन्तु यत् आन्तरिकवर्गाः बाह्यवर्गस्य वस्तु/वर्गनामस्य आवश्यकतां विना प्रत्यक्षतया बाह्यवर्गेषु स्थिरसदस्यान् अभिगन्तुं शक्नुवन्ति । sizeof(external class)=बाह्यवर्गः, आन्तरिकवर्गैः सह किमपि सम्बन्धः नास्ति ।
6. उपसंहारः
मम मूललेखं दृष्ट्वा बहु धन्यवादः। अयं लेखः मुख्यतया व्यक्तिगतशिक्षणाय ज्ञानसाझेदारीयै च उपयुज्यते यदि किमपि त्रुटयः सन्ति तर्हि मम संशोधनार्थं धन्यवादः। यदि भवन्तः उद्धृतुं प्रवृत्ताः सन्ति तर्हि सम्पर्कं सूचयन्तु ।