क्लास इंटर्नल्स और डिफ़ॉल्ट कंस्ट्रक्टर
यहां हम क्लास इंटर्नल्स देखेंगे। उससे पहले हम डिफ़ॉल्ट कंस्ट्रक्टर्स देखेंगे जो इंटर्नल्स से संबंधित हैं। डिफ़ॉल्ट कंस्ट्रक्टर वह कंस्ट्रक्टर है (यूजर द्वारा परिभाषित या कंपाइलर द्वारा) जो कोई आर्गुमेंट नहीं लेता। अब सवाल आता है, डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग क्यों किया जाता है?
यदि डिफ़ॉल्ट कंस्ट्रक्टर नहीं दिया गया है, तो कंपाइलर अंतर्निहित रूप से डिफ़ॉल्ट कंस्ट्रक्टर घोषित करेगा। डिफ़ॉल्ट कंस्ट्रक्टर्स का उपयोग कुछ क्लास इंटर्नल्स को इनिशियलाइज़ करने के लिए किया जाता है। यह क्लास के डेटा सदस्यों को प्रभावित नहीं करेगा। कंपाइलर कुछ अलग स्थितियों में डिफ़ॉल्ट कंस्ट्रक्टर डालता है। मान लीजिए एक क्लास दूसरी क्लास से डिफ़ॉल्ट कंस्ट्रक्टर के साथ डेराइव्ड है, या एक क्लास किसी अन्य क्लास के ऑब्जेक्ट को डिफ़ॉल्ट कंस्ट्रक्टर के साथ रखती है। कंपाइलर बेस क्लास या वर्तमान ऑब्जेक्ट के अंदर रखे ऑब्जेक्ट के लिए डिफ़ॉल्ट कंस्ट्रक्टर को कॉल करने के लिए कोड डालता है।
उदाहरण
#include <iostream>
using namespace std;
class Base {
public:
// कंपाइलर क्लास "Base" के लिए एक कंस्ट्रक्टर बनाएगा
};
class ClassA {
public:
ClassA() {
cout << "ClassA Constructor defined by user" << endl;
}
int x; // यह इनिशियलाइज़ नहीं होगा
};
class ClassB : public ClassA {
// कंपाइलर ClassB कंस्ट्रक्टर बनाएगा और ClassA कंस्ट्रक्टर को कॉल करने के लिए कोड जोड़ेगा
};
class ClassC : public ClassA {
public:
ClassC() { // यूजर डिफाइंड कंस्ट्रक्टर, लेकिन कंपाइलर A कंस्ट्रक्टर को कॉल करने का कोड जोड़ेगा
cout << "User defined ClassC Constructor" << endl;
}
};
class ClassD {
public:
ClassD() {
// यूजर डिफाइंड डिफ़ॉल्ट कंस्ट्रक्टर। कंपाइलर ClassA के ऑब्जेक्ट को कॉल करने के लिए कोड जोड़ेगा
cout << "User-defined constructor for ClassD Constructor" << endl;
}
private:
ClassA obj;
};
int main() {
Base baseObj;
ClassB b;
ClassC c;
ClassD d;
return 0;
}
आउटपुट
ClassA Constructor defined by user ClassA Constructor defined by user User defined ClassC Constructor ClassA Constructor defined by user User-defined constructor for ClassD Constructor
व्याख्या
- Base baseObj: कंपाइलर Base के लिए डिफ़ॉल्ट कंस्ट्रक्टर प्रदान करता है (कोई आउटपुट नहीं)
- ClassB b: ClassB का कंपाइलर-जनरेटेड कंस्ट्रक्टर ClassA() को कॉल करता है → "ClassA Constructor defined by user"
- ClassC c: ClassC का यूजर-डिफाइंड कंस्ट्रक्टर, लेकिन कंपाइलर पहले बेस ClassA() को कॉल करता है → "ClassA Constructor defined by user" फिर "User defined ClassC Constructor"
- ClassD d: ClassD का यूजर-डिफाइंड कंस्ट्रक्टर चलता है → "User-defined constructor for ClassD Constructor", फिर मेंबर obj के लिए ClassA() → "ClassA Constructor defined by user"
महत्वपूर्ण बिंदु
- डिफ़ॉल्ट कंस्ट्रक्टर = कोई पैरामीटर नहीं (या सभी डिफ़ॉल्ट पैरामीटर)
- कंपाइलर डिफ़ॉल्ट कंस्ट्रक्टर तभी जनरेट करता है जब कोई यूजर-डिफाइंड कंस्ट्रक्टर न हो
- बेस क्लास कंस्ट्रक्टर हमेशा डेराइव्ड क्लास कंस्ट्रक्टर बॉडी से पहले चलते हैं
- मेंबर ऑब्जेक्ट्स कंस्ट्रक्टर्स घोषणा के क्रम में चलते हैं
- डिस्ट्रक्टर रिवर्स ऑर्डर में चलते हैं
कंपाइलर द्वारा जनरेटेड फंक्शन्स
यदि यूजर द्वारा परिभाषित नहीं हैं, तो कंपाइलर जनरेट कर सकता है:
- डिफ़ॉल्ट कंस्ट्रक्टर
- कॉपी कंस्ट्रक्टर
- कॉपी असाइनमेंट ऑपरेटर
- मूव कंस्ट्रक्टर (C++11)
- मूव असाइनमेंट ऑपरेटर (C++11)
- डिस्ट्रक्टर
बेस्ट प्रैक्टिस
- यदि कोई कंस्ट्रक्टर परिभाषित करते हैं, तो डिफ़ॉल्ट कंस्ट्रक्टर मैन्युअल रूप से जोड़ें यदि आवश्यक हो
= defaultका उपयोग करके स्पष्ट रूप से डिफ़ॉल्ट व्यवहार का अनुरोध करें= deleteका उपयोग करके अवांछित जनरेटेड फंक्शन्स को अक्षम करें