दिलचस्प पोस्ट
किसी प्रदीप्ति द्वारा स्ट्रीम को सीमित करें Prolog: एक व्यक्ति खुद का एक भाई है? एक तत्व के भीतर पाठ की स्थिति प्राप्त करें मैं एक mysql तालिका स्तंभ डिफ़ॉल्ट कैसे बदल सकता हूँ? : अपरिचित चयनकर्ता को उदाहरण के लिए भेजा गया एल्माः त्रुटि रिपोर्ट से JSON HTTP अनुरोध निकाय कैसे प्राप्त करें I क्या एक कलाकार ऑपरेटर स्पष्ट हो सकता है? Html.DropdownListFor चयनित मान सेट नहीं किया जा रहा है MySQL में नल (प्रदर्शन और संग्रहण) foreach चेकबॉक्स पोस्ट में php किसी शर्त से सरणी कैसे फ़िल्टर करें Android में एक अंतहीन गैलरी कैसे कार्यान्वित करें? मैं एक गीथहब फ़ॉर्केड रिपॉज़िटरी कैसे अपडेट करूं? PHP में पूर्ण पथ से संबंधित पथ प्राप्त करना मैं एक मौजूदा जावास्क्रिप्ट फ़ंक्शन के लिए जावास्क्रिप्ट कीबोर्ड शॉर्टकट कैसे जोड़ सकता हूँ?

कक्षा के लिए कंपाइलर द्वारा बनाए गए सभी सदस्य-फ़ंक्शन क्या हैं? क्या ऐसा हर समय होता है?

कक्षा के लिए कंपाइलर द्वारा बनाए गए सभी सदस्य-फ़ंक्शन क्या हैं? क्या ऐसा हर समय होता है? नाशक की तरह मेरी चिंता है कि यह सभी वर्गों के लिए बनाई गई है, और डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता क्यों है?

Solutions Collecting From Web of "कक्षा के लिए कंपाइलर द्वारा बनाए गए सभी सदस्य-फ़ंक्शन क्या हैं? क्या ऐसा हर समय होता है?"

सी ++ 98/03

यदि वे आवश्यक हैं,

  1. कंपाइलर आपके लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न करेगा जब तक कि आप अपने खुद के किसी निर्माता का घोषित नहीं करते।
  2. कंपाइलर आपके लिए प्रतिलिपि कन्स्ट्रक्टर उत्पन्न करेगा जब तक कि आप अपनी खुद की घोषणा नहीं करेंगे
  3. संकलक आप के लिए एक प्रतिलिपि असाइनमेंट ऑपरेटर उत्पन्न करेगा जब तक कि आप अपनी खुद की घोषणा नहीं करेंगे
  4. कंपाइलर आपके लिए एक नाशक उत्पन्न करेगा जब तक कि आप अपनी खुद की घोषणा नहीं करेंगे

जैसा कि पेटर ने एक सहायक टिप्पणी में कहा था, ये सभी केवल जब संकलक की आवश्यकता होती है तब ही तैयार होते हैं (अंतर यह है कि, जब संकलक उन्हें नहीं बना सकता है, तब तक ठीक है जब तक उनका उपयोग नहीं किया जाता।)


सी ++ 11

C ++ 11 निम्नलिखित नियम जोड़ता है, जो C ++ 14 के लिए भी सत्य हैं (टोवी के लिए क्रेडिट, यह टिप्पणी देखें) :

  • कंपाइलर चाल निर्माता बनाता है अगर
    • कोई उपयोगकर्ता घोषित कॉपी निर्माता नहीं है , और
    • कोई भी उपयोगकर्ता घोषित कॉपी असाइनमेंट ऑपरेटर नहीं है , और
    • कोई उपयोगकर्ता-घोषित चाल असाइनमेंट ऑपरेटर नहीं है और
    • कोई उपयोगकर्ता घोषित नाशक नहीं है ,
    • इसे हटाए गए के रूप में चिह्नित नहीं किया गया है ,
    • और सभी सदस्य और कुर्सियां चलने योग्य हैं
  • स्थानांतरण असाइनमेंट ऑपरेटर के लिए समान: यदि कोई उपयोगकर्ता परिभाषित नहीं है तो यह उत्पन्न होता है
    • कोई उपयोगकर्ता घोषित कॉपी निर्माता नहीं है , और
    • कोई भी उपयोगकर्ता घोषित कॉपी असाइनमेंट ऑपरेटर नहीं है , और
    • कोई उपयोगकर्ता घोषित चाल निर्माता नहीं है और
    • कोई उपयोगकर्ता घोषित नाशक नहीं है ,
    • इसे हटाए गए के रूप में चिह्नित नहीं किया गया है ,
    • और सभी सदस्य और कुर्सियां चलने योग्य हैं

ध्यान दें कि ये नियम सी + + 03 नियमों की तुलना में थोड़े अधिक विस्तृत हैं और व्यवहार में अधिक समझदारी करते हैं।

Thing लिए आइटम के बारे में अधिक आसानी से समझने के लिए:

 class Thing { public: Thing(); // default constructor Thing(const Thing&); // copy c'tor Thing& operator=(const Thing&); // copy-assign ~Thing(); // d'tor // C++11: Thing(Thing&&); // move c'tor Thing& operator=(Thing&&); // move-assign }; 

और आगे पढ़ने के लिए, यदि आप एक सी ++ – शुरुआत कर रहे हैं तो एक डिज़ाइन पर विचार करें कि आपको पिछले पांच में से किसी को लागू करने की आवश्यकता नहीं है, उर्फ द नियम ऑफ़ ज़ीरो ( मार्टिंहो फर्नांडीस द्वारा)

क्या आपका मतलब है 'निर्मित' द्वारा 'परिभाषित'?

$ 12.1 – "डिफ़ॉल्ट कन्स्ट्रक्टर (12.1), कॉपी निर्माता और प्रतिलिपि असाइनमेंट ऑपरेटर (12.8), और नाशक (12.4) विशेष सदस्य कार्य हैं

यदि 'निर्मित' का मतलब 'परिभाषित' है, तो यहां सी ++ मानक से महत्वपूर्ण भाग हैं।

-एक क्लास के लिए एक अन्तर्निहित रूप से घोषित डिफ़ॉल्ट कन्स्ट्रक्टर निरोधात्मक रूप से परिभाषित किया जाता है, जब इसका उपयोग इसके वर्ग प्रकार (1.8) के ऑब्जेक्ट बनाने के लिए किया जाता है।

अगर किसी वर्ग में कोई उपयोगकर्ता-घोषित नाशक नहीं होता है, तो एक नाशक को निस्संदेह घोषित किया जाता है। एक निहित-घोषित नाशक को निहित रूप से परिभाषित किया जाता है, जब इसका उपयोग उसके वर्ग प्रकार के किसी वस्तु को नष्ट करने के लिए किया जाता है।

-यदि क्लास की परिभाषा स्पष्ट रूप से प्रतिलिपि कन्स्ट्रक्टर घोषित नहीं करती है, तो एक को स्पष्ट रूप से घोषित किया जाता है एक निहित-घोषित प्रति कन्स्ट्रक्टर निस्पष्ट रूप से परिभाषित किया जाता है, यदि इसका उपयोग उसके वर्ग प्रकार के किसी ऑब्जेक्ट को उसके क्लास प्रकार के ऑब्जेक्ट की एक प्रति या इसके क्लास प्रकार से व्युत्पन्न वर्ग के प्रकार से प्रारंभ करने के लिए किया जाता है)।

-यदि क्लास की परिभाषा स्पष्ट रूप से प्रतिलिपि असाइनमेंट ऑपरेटर घोषित नहीं करती है, तो एक को पूर्ण रूप से घोषित किया जाता है एक निहित-घोषित प्रतिलिपि असाइनमेंट ऑपरेटर निहित रूप से परिभाषित किया जाता है, जब उसके क्लास प्रकार के ऑब्जेक्ट को अपनी क्लास प्रकार का मान या उसके क्लास प्रकार से व्युत्पन्न क्लास प्रकार के मान को असाइन किया जाता है।

डिफ़ॉल्ट रूप से, उपयोगकर्ता द्वारा कार्यान्वित नहीं किया जाता है, तो कंपाइलर कक्षा में कुछ सदस्य कार्य जोड़ता है। उनको चार बड़े कहा जाता है:

  • डिफ़ॉल्ट कन्स्ट्रक्टर
  • प्रतिलिपि निर्माता
  • कॉपी ऑपरेटर (असाइनमेंट)
  • नाशक

सदस्यों के प्रकारों के आधार पर और आपने कौन से सदस्य कार्य किया है, आप अपने आप को उपलब्ध कराते हैं, वे सभी उत्पन्न नहीं होंगे।

अन्य उत्तरों ने आपको बताया है कि क्या बनाया गया है, और यह कि यदि इस्तेमाल किया जाए तो संकलक केवल उन्हें उत्पन्न कर सकता है

मेरी चिंता है कि यह सभी वर्गों के लिए बनाई गई है …

क्यों चिंतित? यह निष्पादन योग्य में अवांछित कोड बना रहा है सोच रहा है? संभावना नहीं है, लेकिन आप आसानी से अपने पर्यावरण के साथ पर्याप्त जांच कर सकते हैं

या शायद आपकी चिंता यह थी कि जब आप चाहें तो कोई निर्माता नहीं बना सकता है? चिंता करने की कोई बात नहीं … यदि आवश्यक हो तो वे हमेशा बनाए जाते हैं और उपयोगकर्ता द्वारा प्रदान नहीं किए जाते हैं।

… और डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता क्यों है?

क्योंकि कक्षाओं में उनके भीतर के ऑब्जेक्ट्स को अपने स्वयं के डिस्ट्रिक्टर्स के साथ हो सकते हैं जिन्हें व्यवस्थित रूप से लागू करने की आवश्यकता होती है। उदाहरण के लिए, दिए गए …

 struct X { std::string a; std::string b; }; 

… डिफ़ॉल्ट डिस्ट्रक्टर सुनिश्चित करता है कि डिस्ट्रक्टर्स को ए और बी रन के लिए।