यह दोनों स्थिरांक और परिवर्तनशील वेरिएंट घोषित करने के लिए है, इसलिए की तरह असामान्य बात नहीं है:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
अपने कार्यक्रम के साथ मूल समस्या है कि आप एक स्थिरांक विधि से एक गैर स्थिरांक संदर्भ वापसी है।
std::vector<int>& VectorHolder::getVector() const {
return myVector; // << error: return mutable reference from const method
}
ताकि आप इसे इस प्रपत्र का उपयोग const बनाने:
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
और जब यह एक गैर स्थिरांक विधि में है या ग्राहक एक गैर स्थिरांक संदर्भ रखती है, तो आप कानूनी तौर पर एक गैर-उपयोग कर सकते हैं स्थिरांक विधि:
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
अंत में, आप (कुछ मामलों में) कोई मान सकता है:
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
क्योंकि प्रतिलिपि के लिए कोई उत्परिवर्तन की आवश्यकता नहीं है और आंतरिक डेटा का कोई संपर्क नहीं प्रदान करता है।
ताकि आप दोनों प्रकारों को अक्सर घोषित कर सकें।
दोनों की घोषणा के परिणाम हैं:
VectorHolder m;
const VectorHolder c;
m.getVector().size(); // << ok
c.getVector().size(); // << ok - no mutation
m.getVector().push_back(a); // << ok
c.getVector().push_back(a); // << error: attempt to mutate const reference because the const vector is returned
तो यह सब (तरीकों में से अतिरेक से अलग) अच्छी तरह से बाहर काम करता है।
इस तरह तो कोड जहां इसे वापस से बाद लौटे वेक्टर संशोधित करने के लिए असंभव है:
इसलिए आप getVector() इस तरह की घोषणा करने के लिए है? – arjacsoh
@arjacsoh: यह निर्भर करता है। संपादन देखें। – Nawaz