रूल ऑफ थ्री C++ का उपयोग करते समय एक थंब रूल है। यह एक तरह की अच्छी प्रैक्टिस रूल है जो कहती है कि यदि आपकी क्लास को निम्न में से किसी की आवश्यकता है:
- एक कॉपी कंस्ट्रक्टर,
- एक असाइनमेंट ऑपरेटर,
- या एक डिस्ट्रक्टर,
स्पष्ट रूप से परिभाषित, तो इसे संभवतः उन सभी तीन की आवश्यकता होगी।
यह क्यों है? ऐसा इसलिए है क्योंकि, यदि आपकी क्लास को उपरोक्त में से किसी की आवश्यकता है, तो यह डायनामिकली अलोकेटेड रिसोर्सेज को मैनेज कर रही है और सफलतापूर्वक ऐसा करने के लिए दूसरों की भी आवश्यकता होगी। उदाहरण के लिए, यदि आपको असाइनमेंट ऑपरेटर की आवश्यकता है, तो आप वर्तमान में रेफरेंस द्वारा कॉपी किए जा रहे ऑब्जेक्ट्स की कॉपी बना रहे होंगे, इसलिए रिसोर्सेज अलोकेट कर रहे होंगे। आपको कॉपी करने के लिए कॉपी कंस्ट्रक्टर और इन रिसोर्सेज को फ्री करने के लिए डिस्ट्रक्टर की आवश्यकता होगी।
रूल ऑफ फाइव C++11 में मूव सेमांटिक्स की शुरूआत के कारण रूल ऑफ थ्री का एक विस्तार है। रूल ऑफ फाइव को भी C++ में रिसोर्स मैनेजमेंट के लिए लागू किया जाता है। यह नियम C++ कोड में संभावित रूप से मेमोरी लीक और अन्य समस्याओं को समाप्त करता है। द रूल ऑफ द बिग फाइव कहता है कि यदि आपको निम्नलिखित फ़ंक्शन्स में से किसी एक को लिखना है तो आपके पास उन सभी के लिए एक पॉलिसी होनी चाहिए। यदि हमारे पास एक ऑब्जेक्ट Foo है तो हमारे पास एक FooManager हो सकता है जो रिसोर्स Foo को संभालता है। FooManager को लागू करते समय, आपको संभवतः निम्नलिखित सभी फ़ंक्शन्स को लागू करने की आवश्यकता होगी:
डिस्ट्रक्टर - जब यह मैनेजर स्कोप से बाहर जाता है तो इसे उन सभी रिसोर्सेज को फ्री करना चाहिए जिन्हें यह मैनेज कर रहा था।
असाइनमेंट ऑपरेटर - यदि आप एक प्रदान नहीं करते हैं तो कंपाइलर एक डिफ़ॉल्ट असाइनमेंट ऑपरेटर बनाता है। डिफ़ॉल्ट असाइनमेंट ऑपरेशन एक मेंबर-वाइज कॉपी फ़ंक्शन है और शैलो कॉपी करता है न कि डीप कॉपी। इससे मेमोरी लीक, गलत असाइनमेंट जैसी समस्याएं हो सकती हैं।
कॉपी कंस्ट्रक्टर - कंपाइलर द्वारा प्रदान किया गया कॉपी कंस्ट्रक्टर FooManager के सभी एट्रिब्यूट्स की मेंबर-वाइज कॉपी करता है। यह असाइनमेंट ऑपरेटर के समान समस्याएं पैदा करता है।
मूव कंस्ट्रक्टर - ऑब्जेक्ट्स को कॉपी करना महंगा हो सकता है क्योंकि इसमें अस्थायी ऑब्जेक्ट्स बनाना, कॉपी करना और फिर नष्ट करना शामिल होता है। C++11 ने r-value रेफरेंस की अवधारणा पेश की। एक r-value रेफरेंस को एक r-value से स्पष्ट रूप से बांधा जा सकता है। एक r-value एक अनाम ऑब्जेक्ट है। एक अस्थायी ऑब्जेक्ट, दूसरे शब्दों में। इस r-value रेफरेंस का उपयोग कंस्ट्रक्टर में पास किए गए r-value का रेफरेंस बनाने के लिए किया जा सकता है।
मूव कंस्ट्रक्टर - ऑब्जेक्ट्स को कॉपी करना महंगा हो सकता है क्योंकि इसमें अस्थायी ऑब्जेक्ट्स बनाना, कॉपी करना और फिर नष्ट करना शामिल होता है। C++11 ने r-value रेफरेंस की अवधारणा पेश की। एक r-value रेफरेंस को एक r-value से स्पष्ट रूप से बांधा जा सकता है। एक r-value एक अनाम ऑब्जेक्ट है। एक अस्थायी ऑब्जेक्ट, दूसरे शब्दों में। इस r-value रेफरेंस का उपयोग कंस्ट्रक्टर में पास किए गए r-value का रेफरेंस बनाने के लिए किया जा सकता है।
मूव असाइनमेंट ऑपरेटर - एक समय में केवल एक रिसोर्स होना उपयोगी होता है। इस रिसोर्स के स्वामित्व को एक मैनेजर से दूसरे में ट्रांसफर किया जा सकता है। ऐसे मामलों में, आप मूव असाइनमेंट ऑपरेटर प्रदान कर सकते हैं।
रूल ऑफ फाइव के बारे में जानने के लिए यह एक बेहतरीन संसाधन है: https://www.feabhas.com/sites/default/files/2016-06/Rule%20of%20the%20Big%20Five.pdf.