सबसे पहले, एक संदर्भ आप संदर्भित वस्तु पर एम्परसेंड ऑपरेटर का उपयोग करने की जरूरत नहीं लौटने के लिए ; यदि आप पॉइंटर प्राप्त करना चाहते हैं तो इसकी आवश्यकता है। तो, मुझे लगता है कि आप return Bar;
लिखना चाहते थे।
फिर, नहीं, आप ऐसा नहीं कर सकते; एक const
विधि में आप एक const
this
सूचक है (आपके मामले में यह एक const Foo *
होगा), जिसका अर्थ है कि किसी भी संदर्भ आप अपने क्षेत्रों को प्राप्त कर सकते हैं एक const
संदर्भ हो जाएगा, के बाद से आप उन्हें एक के माध्यम से एक्सेस कर रहे हैं " const
पथ "।
इस प्रकार, यदि आप उस कोड में जो किया है उसे करने का प्रयास करते हैं तो आपको एक संकलन त्रुटि मिल जाएगी, क्योंकि आप const int &
के साथ int &
(आपकी विधि का वापसी मूल्य) प्रारंभ करने का प्रयास करेंगे (संदर्भ Bar
से प्राप्त करें), जो स्पष्ट रूप से वर्जित है।
जी ++ वास्तव में कहते हैं:
testconstref.cpp: In member function ‘int& Foo::GetBar() const’:
testconstref.cpp:9: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘const int*’
जो है मैं तो बस क्या कहा। :)
यदि, इसके बजाय, आप const
const
विधि से किसी क्लास फ़ील्ड के संदर्भ में const
संदर्भ वापस लेते हैं तो आपको कोई समस्या नहीं होगी।
- को छोड़कर खेतों
mutable
के रूप में चिह्नित है, जो संकलक कि ऐसे क्षेत्रों भी const
तरीकों से परिवर्तनीय हैं करने के लिए कहता है; इस अपवाद को const
ऑब्जेक्ट की "वास्तविक" स्थिति को बदलने के तरीकों में मामलों को बदलने की अनुमति देने के लिए पेश किया गया है जब यह "तार्किक" स्थिति को परिवर्तित नहीं करता है; इस आलसी मूल्यांकन, संदर्भ गिनती, लागू करने के लिए उपयोगी हो सकता है ...
स्रोत
2011-02-10 12:36:09
मुझे लगता है कि आप पहले से ही अपने प्रश्न का उत्तर दे चुके हैं। इसके अतिरिक्त उदाहरण में बार पहले से ही सार्वजनिक है। – XAder
'और बार 'में' const int * 'टाइप किया गया है, न कि' int & '। आप संकलक आपको बता रहे हैं कि यह ठीक नहीं है। –
क्या आपने संकलन करने की कोशिश की है? कंपाइलर ने आपको क्या बताया? –