मैं निम्नलिखित कोड को देखा है?सी ++ समान विधि हस्ताक्षर लेकिन अलग वापसी प्रकार
उत्तर
दो कार्य वास्तव में समान नहीं हैं। केवल दूसरा फ़ंक्शन const
सदस्य फ़ंक्शन के रूप में घोषित किया गया है। यदि ऑब्जेक्ट जिसे सदस्य से बुलाया जाता है const
है, तो बाद का विकल्प उपयोग किया जाता है। यदि ऑब्जेक्ट गैर- const
है, तो पहला विकल्प उपयोग किया जाता है।
उदाहरण:
void any_func(const Type *t)
{
something = t->value(); //second `const` version used
}
void any_func2(Type *t)
{
something = t->value(); //first non-`const` version used
}
यदि दोनों कार्यों गैर const
घोषित कर दिया गया या दोनों const
घोषित किया गया, संकलक होगा (, वैसे भी चाहिए) शिकायत करते हैं।
संकलक क्यों शिकायत नहीं करता है के बारे में
क्योंकि एक अलग समारोह हस्ताक्षर के लिए const
गिना जाता है। आपकी धारणा फ़ंक्शन हस्ताक्षर समान गलत है।
const
के रूप में चिह्नित फ़ंक्शन को const
उदाहरण या Type<T>
के संदर्भ के लिए बुलाया जाएगा।
और कैसे पता चलेगा कि किसको आह्वान किया जाता है?
कार्यों में एक cout
बयान रखो और निम्नलिखित मामलों का परीक्षण:
template <class T>
class Type {
public:
Type() {}
T& operator=(const T& rhs) {value() = rhs; return value();}
T& value() {
std::cout << "non const version" << std endl;
return m_value;
}
T value() const {
std::cout << "const version" << std endl;
return m_value;
}
private:
T m_value;
};
int main() {
Type<int> t;
t.value();
Type<int> rt = t;
rt.value();
Type<int>* pt = &t;
pt->value();
const Type<int> ct;
ct.value();
const Type<int>& crt = t;
crt.value();
const Type<int>* pct = &t;
pct->value();
}
आपका असाइनमेंट ऑपरेटर गैर स्थिरांक संस्करण कॉल करेंगे।
स्थिरांक संस्करण बेहतर तरह
const T& value() const {
std::cout << "const version" << std endl;
return m_value;
}
दिखना चाहिए क्योंकि आप हमेशा RVO (वापसी मान अनुकूलन) पर भरोसा नहीं कर सकते हैं, और अतिरिक्त प्रतियां लिया जा सकता है (विशेष रूप से बड़े संकलक कार्यान्वयन के लिए)।
यह भी ध्यान रखें असाइनमेंट ऑपरेटर वर्तमान उदाहरण के लिए एक संदर्भ लौटना चाहिए:
Type& operator=(const T& rhs) {value() = rhs; return *this;}
कार्यों संकल्प प्राथमिकता के आधार पर शब्दों की एक जोड़ी। कंपाइलर निम्नलिखित तरीके से कॉन्स/गैर कॉन्स फ़ंक्शंस के बीच अंतर करता है:
यदि किसी वर्ग में दिए गए नाम और तर्क सूची के साथ केवल कॉन्स्ट फ़ंक्शन है, तो इसे निरंतर और गैर-निरंतर वस्तुओं के समान कहा जाएगा।इस फ़ंक्शन को कॉल करने के बाद, ऑब्जेक्ट 'दृढ़ता' मान लेगा (भले ही यह स्थिर न हो), जिसका अर्थ है कि फ़ंक्शन केवल अन्य कॉन्स्ट फ़ंक्शंस को कॉल कर सकता है।
यदि किसी वर्ग में केवल गैर-कॉन्स्ट फ़ंक्शन है, तो इसे गैर-कॉन्स्ट ऑब्जेक्ट्स के लिए बुलाया जाएगा। कॉन्स्ट ऑब्जेक्ट्स के लिए इस फ़ंक्शन को कॉल करने का प्रयास संकलन त्रुटि का कारण बन जाएगा।
यदि किसी वर्ग में दोनों कार्य उपलब्ध हैं, तो कॉन्स्ट वर्जन का उपयोग कॉन्स ऑब्जेक्ट्स के लिए किया जाएगा, गैर-कॉन्स संस्करण गैर-कॉन्स ऑब्जेक्ट्स के लिए उपयोग किया जाएगा।
विवरण में प्रारंभिक मिश्रण पर मेरा ध्यान इंगित करने के लिए @owacoder के लिए धन्यवाद।
मुझे लगता है कि दूसरे अनुच्छेद में तर्क पीछे की तरफ है। गैर-'const' फ़ंक्शंस ** ** को 'const' ऑब्जेक्ट्स के लिए नहीं कहा जा सकता है। – owacoder
@owacoder, निश्चित रूप से वे कर सकते हैं। अपने आप को कोशिश करो – SergeyA
@owacoder, मेरा बुरा। आप सही हैं, मैंने आपकी टिप्पणी को गलत तरीके से पढ़ा और मेरा जवाब गलत टाइप किया। इसे संपादित करेंगे। – SergeyA
- 1. अलग वापसी प्रकार
- 2. क्या करना है यदि समान इंटरफेस वाले वर्ग समान लेकिन अलग-अलग विधि हस्ताक्षर वाले हैं?
- 3. जेनेरिक विधि हस्ताक्षर और मानक हस्ताक्षर समान
- 4. सी # प्रतिनिधियों और विधि हस्ताक्षर
- 5. जावा विधि हस्ताक्षर में वापसी प्रकार में कीवर्ड फैली
- 6. विधि वापसी प्रकार
- 7. स्केल एकाधिक विरासत में, समान हस्ताक्षर के साथ विरोधाभासी विधियों को कैसे हल करें लेकिन अलग-अलग रिटर्न प्रकार?
- 8. विधि हस्ताक्षर
- 9. अधिभावी इंटरफ़ेस विधि वापसी प्रकार
- 10. सी #: विधि हस्ताक्षर?
- 11. सी # रिटर्न अलग-अलग प्रकार?
- 12. सी #: बूलियन वापसी प्रकार
- 13. अज्ञात वापसी प्रकार त्रुटि (सी ++)
- 14. सी # अधिभार वापसी प्रकार - अनुशंसित दृष्टिकोण
- 15. गोलांग विधियों के समान नाम और धर्मार्थता, लेकिन विभिन्न प्रकार
- 16. JAXB @XmlElements, विभिन्न प्रकार लेकिन समान नाम?
- 17. वापसी प्रकार बदलने के लिए ओवरराइडिंग विधि
- 18. वापसी प्रकार
- 19. वापसी प्रकार
- 20. सी ++ वापसी प्रकार अधिभार हैक
- 21. विधि वापसी प्रकार में NullPointerException ऑब्जेक्ट
- 22. विधि पैरामीटर और/या वापसी प्रकार
- 23. समान एक्सटेंशन वाले फ़ाइलों के लिए अलग-अलग आइकन लेकिन अलग-अलग सामग्री?
- 24. वापसी प्रकार
- 25. वेब सेवा विधि हस्ताक्षर
- 26. विधि हस्ताक्षर
- 27. जावा सामान्य वापसी प्रकार
- 28. समान रिटर्न प्रकार क्यों है लेकिन परिणाम अंतर
- 29. अस्पष्ट इंटरफ़ेस विधि हस्ताक्षर कैसे हल करें, जब कई सामान्य प्रकार के तर्क समान होते हैं
- 30. प्रकार हस्ताक्षर
यह निर्धारित करते समय कीवर्ड को अनदेखा न करें कि दो फ़ंक्शन हस्ताक्षर "समान" हैं या नहीं! –