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

C++ का तीन का नियम


तीन का नियम C++ के नियमों में से एक है जो अपवाद-सुरक्षित कोड बनाने के लिए अंगूठे के नियमों के अंतर्गत आता है। ये नियम निर्धारित करते हैं कि क्लास के डिफ़ॉल्ट सदस्यों का उपयोग अपवाद-मुक्त अभ्यास के लिए कैसे किया जाना चाहिए।

तीन के नियम को बिग थ्री के नियम या द बिग थ्री के नाम से भी जाना जाता है और यह क्लास के लिए निर्धारित करता है कि यदि कोई क्लास उल्लिखित तीन में से किसी को परिभाषित करता है तो उसे शायद स्पष्ट रूप से सभी तीन को परिभाषित करना चाहिए -

  • डिस्ट्रक्टर
  • कॉपी कंस्ट्रक्टर
  • कॉपी असाइनमेंट कंस्ट्रक्टर

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

ऐसा इसलिए होता है क्योंकि निहित रूप से उत्पन्न कंस्ट्रक्टर और असाइनमेंट ऑपरेटर डेटा सदस्यों की शैलो कॉपी करते हैं। जब क्लास में डायनामिक रूप से आवंटित संसाधनों को इंगित करने वाले पॉइंटर होते हैं तो हमें डीप कॉपी की आवश्यकता होती है।

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

आइए एक उदाहरण से समझते हैं जहां कोई कॉपी कंस्ट्रक्टर और कोई कॉपी असाइनमेंट ऑपरेटर नहीं है, लेकिन डिस्ट्रक्टर मौजूद है -

उदाहरण

#include <stdio.h> class Numbers{ private:    int num;    int* ptr;    public:    Numbers( int n, int* p ) //कॉपी कंस्ट्रक्टर{       num =n ;       ptr = new int[ num ];    }    ~Numbers() //डिस्ट्रक्टर{       delete ptr;       ptr = NULL;    } }; int main(){    int arr[ 4 ] = { 11, 22, 33, 44 };    Numbers Num1( 4, arr );    // यह समस्या पैदा करता है    Numbers Num2( Num1 );    return 0; }

आउटपुट

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001f46c20 *** Aborted
  • यह इसलिए हुआ क्योंकि प्रोग्राम स्कोप से बाहर जाने पर डिस्ट्रक्टर दो बार कॉल होता है। पहले Num1 का डिलीशन और फिर Num2 का। डिफ़ॉल्ट कॉपी कंस्ट्रक्टर पॉइंटर ptr की कॉपी बनाता है लेकिन उसके लिए मेमोरी आवंटित नहीं करता। इसलिए, जब Num1 हटाया जाता है तो बाद के ptr प्रोग्राम को क्रैश कर देते हैं।


  1. - C++11 में रूल ऑफ फाइव क्या है?

    रूल ऑफ फाइव को C++ में रिसोर्स मैनेजमेंट के लिए लागू किया जाता है। रिसोर्स मैनेजमेंट क्लाइंट को मैनेज्ड ऑब्जेक्ट के जीवनकाल के बारे में चिंता करने से मुक्त करता है, संभावित रूप से C++ कोड में मेमोरी लीक और अन्य समस्याओं को समाप्त करता है। लेकिन यह मैनेजमेंट एक कीमत पर आता है। द रूल ऑफ द बिग फाइव कह

  1. - C++ में रूल ऑफ थ्री बनाम रूल ऑफ फाइव?

    रूल ऑफ थ्री C++ का उपयोग करते समय एक थंब रूल है। यह एक तरह की अच्छी प्रैक्टिस रूल है जो कहती है कि यदि आपकी क्लास को निम्न में से किसी की आवश्यकता है: एक कॉपी कंस्ट्रक्टर, एक असाइनमेंट ऑपरेटर, या एक डिस्ट्रक्टर, स्पष्ट रूप से परिभाषित, तो इसे संभवतः उन सभी तीन की आवश्यकता होगी। यह क्यों है? ऐसा इस

  1. - C++ में 'रूल ऑफ थ्री' क्या है?

    रूल ऑफ थ्री (Rule of Three) C++ में एक अनुभव-आधारित नियम (rule of thumb) है। यह एक अच्छी प्रथा का नियम है जो कहता है कि यदि आपके क्लास को निम्न में से किसी की भी स्पष्ट रूप से आवश्यकता है: एक कॉपी कंस्ट्रक्टर, एक असाइनमेंट ऑपरेटर, या एक डिस्ट्रक्टर, तो संभवतः उसे तीनों की आवश्यकता होगी। ऐसा क्यों