2011-02-24 10 views
13

एसटीएल इस तरह परिभाषाओं से भरा है:कॉन्स्ट और गैर-कॉन्स फ़ंक्शंस का ओवरलोडिंग कैसे काम करता है?

iterator begin(); 
const_iterator begin() const; 

के रूप में वापसी मान संकल्प अधिक भार में भाग नहीं लेता, फर्क सिर्फ इतना है यहाँ समारोह const किया जा रहा है। अधिभार तंत्र का यह हिस्सा है?

vector<int>::const_iterator it = myvector.begin(); 

उत्तर

10

उदाहरण आप दे दी है में:

vector<int>::const_iterator it = myvector.begin(); 

अगर myvectorbegin() के गैर स्थिरांक संस्करण const नहीं है बुलाया जाएगा और आप इटरेटर से const_iterator तक एक अंतर्निहित रूपांतरण पर भरोसा करेंगे।

+1

ओह, जो पहेली को हल करता है ... तो, इसमें एक रूपांतरण शामिल है। धन्यवाद! – davka

4

हाँ, const संशोधक ओवरलोडिंग को प्रभावित करता है: क्या की तरह एक लाइन के समाधान के लिए संकलक एल्गोरिथ्म है। यदि myvector उस बिंदु const संस्करण पर const है बुलाया जाएगा:

void stuff(const vector<int>& myvector) 
{ 
    vector<int>::const_iterator it = myvector.begin(); //const version will be called 
} 

vector<int> myvector;  
vector<int>::const_iterator it = myvector.begin(); //non-const version will be called 
9

संकलक के "एल्गोरिथ्म" इस तरह है: दसवीं कक्षा के हर सदस्य समारोह प्रकार एक्स & (मुझे पता है की एक अंतर्निहित तर्क है, सबसे लगता है कि यह एक्स * है, लेकिन अधिभार संकल्प हम के प्रयोजनों के लिए मानक राज्यों, कि इसे एक संदर्भ मान लें)। कॉन्स्ट फ़ंक्शंस के लिए, तर्क का प्रकार const & है। इस प्रकार एल्गोरिदम, यदि किसी सदस्य फ़ंक्शन को दो संस्करण, कॉन्स्ट और गैर-कॉन्स कहा जाता है, तो दोनों व्यवहार्य उम्मीदवार होते हैं, और सर्वश्रेष्ठ मिलान का चयन ओवरलोड रिज़ॉल्यूशन के अन्य मामलों में किया जाता है। कोई जादू :)

+0

धन्यवाद, यह उपयोगी है, हालांकि मेरी समस्या (गलत) धारणा थी कि कॉन्स्ट वेरिएंट को उस चर के प्रकार के कारण कहा जाता है जिसे इसे असाइन किया गया है। @awoodland ने यह – davka

+0

क्यों समझाया है और पॉइंटर क्यों नहीं है और वह भी ओवरलोड रिज़ॉल्यूशन के लिए, इसके लिए कोई स्पष्ट कारण नहीं है? –

3

सी ++ मानक से (§13.3.1 उम्मीदवार कार्य करता है और तर्क सूचियों):

For non-static member functions, the type of the implicit object parameter is “reference to cv X” where X is the class of which the function is a member and cv is the cv-qualification on the member function declaration. [Example: for a const member function of class X, the extra parameter is assumed to have type “reference to const X”. ]

तो, आपके मामले में, अगर myvector वस्तु है const संकलक begin के संस्करण ले जाएगा जो reference to const vector प्रकार का ऑब्जेक्ट पैरामीटर है जो begin का कॉन्स संस्करण है।

1

यह उल्लेख है कि C++ स्थिरांक तरीकों/कार्य भार (जैसे foo() स्थिरांक) की अनुमति देता है लायक है, लेकिन स्थिरांक नहीं तर्क अधिक भार (जैसे बार (पूर्णांक क) और बार (स्थिरांक पूर्णांक एक))।

1

संकलक निर्धारित करता है कि वस्तु चर स्थिरांक या संकलन समय

यह तो इसी अधिभार उठाता है पर नहीं है, और जो कुछ भी वापसी टाइप यह है।

class C { 
    public: 
     int f() { return 1; } 
     float f() const { return 1.5; } 
}; 

// Non const. 
C c; 
assert(c.f() == 1); 

// Convert variable const at compile time. 
assert(const_cast<const C&>(c).f() == 1.5); 

// Same as above but with an explicit reference. 
const C& d = c; 
assert(d.f() == 1.5); 

// Analogous but with a new const object from the start. 
const C e; 
assert(d.f() == 1.5);