2013-02-04 33 views
5

यदि मैं एक स्ट्रिंग को संशोधित नहीं कर रहा हूं तो पहला विकल्प बेहतर है या दोनों ही हैं- (मैं सिर्फ स्ट्रिंग के माध्यम से पुनरावृत्ति करना चाहता हूं, लेकिन चूंकि स्ट्रिंग आकार बड़ा है, इसलिए मैं स्थानीय प्रतिलिपि बनाना नहीं चाहता ।)स्ट्रिंग?

int getString(string& str1) { 
    //code 
} 


int getString (string str1) { 
    //code 
} 

और अगर मैं स्ट्रिंग को बदलने पर योजना है, तो इन दोनों के बीच कोई अंतर है? क्या ऐसा इसलिए है क्योंकि तार C++ में अपरिवर्तनीय हैं?

+2

स्ट्रिंग्स सी ++ में अपरिवर्तनीय नहीं हैं। यदि आपको इसे संशोधित करने की आवश्यकता नहीं है, तो बस कॉन्स्ट संदर्भ द्वारा पास करें। – chris

उत्तर

7

स्ट्रिंग शाब्दिक अपरिवर्तनीय हैं, std::string रों नहीं हैं।

पहला वाला पास-बाय-रेफरेंस है। यदि आप स्ट्रिंग को संशोधित करने की योजना नहीं बनाते हैं, तो इसे const संदर्भ से पास करें।

दूसरा पास-बाय-वैल्यू है - यदि आप फ़ंक्शन के अंदर स्ट्रिंग को संशोधित करते हैं, तो आप केवल एक प्रति संशोधित करेंगे, इसलिए यह म्यूट है।

+0

इसलिए यदि मैं संदर्भ द्वारा पास करता हूं और स्ट्रिंग को बदलता हूं, तो मूल स्ट्रिंग बदल दी जाएगी? एक प्रति नहीं, जावा के विपरीत? – ofey

+0

@ofey - हाँ, लेकिन पिछली बार मैंने जावा का उपयोग किया था, मुझे पूरा यकीन है कि कक्षा के प्रकार (यानी गैर-मौलिक) प्रकार भी संदर्भ द्वारा पारित किए जाते हैं, मूल्य नहीं। हालांकि जावा में 'स्ट्रिंग' और' स्ट्रिंग' 'के बीच यह अंतर हो सकता है। – slugonamission

+0

@slugonamission इसलिए यदि मैं एक बड़ी स्ट्रिंग को बदलना चाहता हूं और मुझे इसके मूल मूल्य को बचाने की परवाह नहीं है, तो मुझे इसे संदर्भ से पास करना चाहिए और कोई स्थानीय प्रति नहीं बनाई जानी चाहिए? – ofey

9

आप कॉन्स्ट संदर्भ से क्यों नहीं गुजरते हैं? इस तरह न तो एक प्रतिलिपि बनाई जाएगी, न ही बुलाया गया कार्य स्ट्रिंग को संशोधित करने में सक्षम होगा।

int getString(string const &str1) 
{ 
} 
2

हां, एक अंतर होगा।

दूसरा संस्करण (& के बिना) getString समारोह के दायरे में स्ट्रिंग की प्रतिलिपि बनाएगा मूल्य द्वारा। इसका मतलब यह है कि आपके द्वारा किए गए कोई भी अपडेट स्थानीय प्रति को प्रभावित करेंगे, न कि कॉलर की प्रति। यह क्लास की कॉपी कन्स्ट्रक्टर को पुराने मान (std::string(std::string& val)) के साथ कॉल करके किया जाता है।

दूसरी तरफ, पहला संस्करण (& के साथ) संदर्भ द्वारा गुजरता है, इसलिए स्थानीय चर बदलना कॉलर के चर को बदल देगा, जब तक कि संदर्भ को कॉन्स्ट के रूप में चिह्नित न किया जाए (जिस स्थिति में, आप मान नहीं बदल सकते हैं) । यह होना चाहिए क्योंकि यदि आप स्ट्रिंग को नहीं बदल रहे हैं तो कोई कॉपी ऑपरेशन होने की आवश्यकता नहीं है।