2008-10-30 7 views
51

सी ++ में, फ़ंक्शन का हस्ताक्षर आंशिक रूप से इस पर निर्भर करता है कि यह स्थिर है या नहीं। इसका मतलब है कि एक वर्ग के समान हस्ताक्षर वाले दो सदस्य कार्य हो सकते हैं, सिवाय इसके कि कोई एक आधार है और दूसरा नहीं है। यदि आपके पास इस तरह की कक्षा है, तो संकलक यह तय करेगा कि आप जिस ऑब्जेक्ट को कॉल करते हैं उसके आधार पर कॉल करने के लिए कौन सा फ़ंक्शन कॉल करना है: यदि यह कक्षा का एक कॉन्स उदाहरण है, तो फ़ंक्शन का कॉन्स्ट संस्करण कहा जाएगा; यदि वस्तु का आधार नहीं है, तो दूसरा संस्करण कहा जाएगा।सी ++ में कॉन्स ओवरलोडिंग का उपयोग क्या है?

आप इस परिदृश्य का क्या लाभ लेना चाहते हैं?

उत्तर

24

यह वास्तव में केवल तभी समझ में आता है जब सदस्य फ़ंक्शन आपके वर्ग के डेटा सदस्य (या किसी सदस्य का सदस्य, या सदस्य के सदस्य का सदस्य ... आदि) का संकेत देता है। । आम तौर पर डेटा सदस्यों के लिए गैर-कॉन्स्ट पॉइंटर्स या संदर्भ लौटते हैं, लेकिन कभी-कभी यह उचित, या बस बहुत सुविधाजनक (उदा। [] ऑपरेटर) होता है। ऐसे मामलों में, आप गेटटर का एक कॉन्स और गैर-कॉन्स संस्करण प्रदान करते हैं। इस तरह से ऑब्जेक्ट को संशोधित किया जा सकता है या नहीं, इस पर निर्णय का उपयोग कर फ़ंक्शन के साथ रहता है, जिसमें इसे कॉन्स या गैर-कॉन्स घोषित करने का विकल्प होता है।

23

यह वहां है ताकि आप संकलक को लागू कर सकें कि आप एक कॉन्स ऑब्जेक्ट या नियमित रूप से वापस लौटते हैं, और फिर भी एक ही विधि हस्ताक्षर बनाए रखते हैं। Const Correctness पर गहराई से स्पष्टीकरण है।

4

आप यह तय करने के लिए इसका उपयोग करना चाहेंगे कि किसी ऑब्जेक्ट के कॉन्स्ट संदर्भ को वापस करना है या नहीं। एसटीएल के कंटेनर एक कॉन्स्ट_इटरेटर या सामान्य इटरेटर को वापस करने के लिए यह तय करने के लिए एक कॉन्स अधिभारित प्रारंभ() और अंत() फ़ंक्शन का उपयोग करते हैं।

4

std :: map :: operator [] के व्यवहार पर नज़र डालें। यदि आप किसी अमान्य कुंजी का संदर्भ देने का प्रयास करते हैं तो कॉन्स्ट संस्करण एक त्रुटि फेंकता है, लेकिन गैर-कॉन्स्ट संस्करण एक सम्मिलित करता है। सम्मिलन व्यवहार std :: map :: insert (और एक ओवरराइट करेगा, इसके अलावा) का उपयोग करने से कहीं अधिक आसान है लेकिन एक कॉन्स मैप के लिए काम नहीं कर सकता है।

संबंधित मुद्दे