Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ इंटर्नल्स: डिफ़ॉल्ट कंस्ट्रक्टर और क्लास इंटर्नल्स


क्लास इंटर्नल्स और डिफ़ॉल्ट कंस्ट्रक्टर

यहां हम क्लास इंटर्नल्स देखेंगे। उससे पहले हम डिफ़ॉल्ट कंस्ट्रक्टर्स देखेंगे जो इंटर्नल्स से संबंधित हैं। डिफ़ॉल्ट कंस्ट्रक्टर वह कंस्ट्रक्टर है (यूजर द्वारा परिभाषित या कंपाइलर द्वारा) जो कोई आर्गुमेंट नहीं लेता। अब सवाल आता है, डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग क्यों किया जाता है?

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

उदाहरण

#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

व्याख्या

  1. Base baseObj: कंपाइलर Base के लिए डिफ़ॉल्ट कंस्ट्रक्टर प्रदान करता है (कोई आउटपुट नहीं)
  2. ClassB b: ClassB का कंपाइलर-जनरेटेड कंस्ट्रक्टर ClassA() को कॉल करता है → "ClassA Constructor defined by user"
  3. ClassC c: ClassC का यूजर-डिफाइंड कंस्ट्रक्टर, लेकिन कंपाइलर पहले बेस ClassA() को कॉल करता है → "ClassA Constructor defined by user" फिर "User defined ClassC Constructor"
  4. ClassD d: ClassD का यूजर-डिफाइंड कंस्ट्रक्टर चलता है → "User-defined constructor for ClassD Constructor", फिर मेंबर obj के लिए ClassA() → "ClassA Constructor defined by user"

महत्वपूर्ण बिंदु

  • डिफ़ॉल्ट कंस्ट्रक्टर = कोई पैरामीटर नहीं (या सभी डिफ़ॉल्ट पैरामीटर)
  • कंपाइलर डिफ़ॉल्ट कंस्ट्रक्टर तभी जनरेट करता है जब कोई यूजर-डिफाइंड कंस्ट्रक्टर न हो
  • बेस क्लास कंस्ट्रक्टर हमेशा डेराइव्ड क्लास कंस्ट्रक्टर बॉडी से पहले चलते हैं
  • मेंबर ऑब्जेक्ट्स कंस्ट्रक्टर्स घोषणा के क्रम में चलते हैं
  • डिस्ट्रक्टर रिवर्स ऑर्डर में चलते हैं

कंपाइलर द्वारा जनरेटेड फंक्शन्स

यदि यूजर द्वारा परिभाषित नहीं हैं, तो कंपाइलर जनरेट कर सकता है:

  • डिफ़ॉल्ट कंस्ट्रक्टर
  • कॉपी कंस्ट्रक्टर
  • कॉपी असाइनमेंट ऑपरेटर
  • मूव कंस्ट्रक्टर (C++11)
  • मूव असाइनमेंट ऑपरेटर (C++11)
  • डिस्ट्रक्टर

बेस्ट प्रैक्टिस

  • यदि कोई कंस्ट्रक्टर परिभाषित करते हैं, तो डिफ़ॉल्ट कंस्ट्रक्टर मैन्युअल रूप से जोड़ें यदि आवश्यक हो
  • = default का उपयोग करके स्पष्ट रूप से डिफ़ॉल्ट व्यवहार का अनुरोध करें
  • = delete का उपयोग करके अवांछित जनरेटेड फंक्शन्स को अक्षम करें
  1. - C++ में स्ट्रक्चर बनाम क्लास

    C++ में स्ट्रक्चर और क्लास मूल रूप से समान हैं। लेकिन कुछ मामूली अंतर हैं। ये अंतर नीचे दिए गए हैं। क्लास के सदस्य डिफ़ॉल्ट रूप से प्राइवेट होते हैं, लेकिन स्ट्रक्चर के सदस्य पब्लिक होते हैं। आइए इन दो कोड्स को देखें ताकि अंतर देख सकें। उदाहरण कोड #include <iostream> using namespace std; clas

  1. - C++ में वेक्टर को कंस्ट्रक्टर में पास करना

    यह वेक्टर को कंस्ट्रक्टर में पास करने के लिए एक सरल C++ प्रोग्राम है। एल्गोरिथम Begin    Declare a class named as vector.       Declare vec of vector type.       Declare a constructor of vector class.          Pass a vector object v a

  1. - C++ में लोकल क्लास (Local Class)

    लोकल क्लास क्या है? एक फ़ंक्शन के अंदर घोषित क्लास को लोकल क्लास कहते हैं क्योंकि यह उस फ़ंक्शन के लिए स्थानीय (local) होती है। बेसिक उदाहरण #include <iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } नियम और प्रतिबंध लोकल क्लास का नाम