2015-02-10 28 views
6

है ग में तार ++ इस तरह से हेरफेर करने के लिए ठीक है:सी ++ स्ट्रिंग्स म्यूटेबल UNLIKE जावा स्ट्रिंग्स हैं?

string s = "Sting"; 
s[2] = 'a'; 

यह ठीक काम करता है (और प्रिंट 'Stang') लेकिन, ऐसा करना सुरक्षित है?

यदि हां, तो इसका मतलब यह है कि वे उत्परिवर्तनीय हैं?

+3

हां, 'std :: string's mutable हैं। स्ट्रिंग अक्षर, हालांकि, नहीं हैं। –

+0

यह सबसे अधिक संभावना है एक सी ++ स्ट्रिंग। लेकिन आपको स्पष्ट करना चाहिए कि आपका क्या मतलब है। – juanchopanza

+0

नोट: 'char * s =" content "को C++ में बहिष्कृत किया गया है, यह अपरिवर्तनीय' const char * s = "content" होना चाहिए। अपने उदाहरण में स्ट्रिंग मानना ​​एक std :: स्ट्रिंग है, हाँ std :: स्ट्रिंग और वर्णों की एक सरणी [] = "सामग्री" (जो उपरोक्त चार */const char * से अलग है) उत्परिवर्तनीय है। –

उत्तर

0

हां और हां।

यह स्थिति 2.

0

में एक सरणी को संशोधित करने की तरह है हाँ, यह पूरी तरह से सुरक्षित है और हाँ तार परिवर्तनशील हैं, जिसका अर्थ है आप, उन्हें बदलने के लिए उन्हें नई सामग्री संलग्न करें और वे यहां से भी भागों निकाल सकते हैं।

1

स्ट्रिंग अक्षर स्वयं ही जावा की तरह अपरिवर्तनीय है।

स्ट्रिंग अक्षर स्मृति के केवल पढ़ने के हिस्से में संग्रहीत हैं।

उदाहरण के लिए, यदि आप निम्नलिखित की तरह कुछ करते हैं, आप एक segfault मिल जाएगा:

char *ptr = (char *) "hello"; 
ptr[0] = 'a'; //segfault! you can't change something that's immutable 

हालांकि! तुम्हें पता है, स्ट्रिंग s[2] = 'a' का उपयोग कर संशोधित जब तक स्ट्रिंग स्थिरांक कीवर्ड के साथ घोषित किया जाता है सकते हैं,

इस का कारण यह है कि तार के लिए = ऑपरेटर ओवरलोड हो गया है एक तर्क के रूप स्ट्रिंग शाब्दिक ले जाता है, और फिर स्ट्रिंग के माध्यम से लूप शाब्दिक प्रत्येक चरित्र को एक परिवर्तनीय चार सरणी में कॉपी करना।

तो यदि आप जावा और सी में स्ट्रिंग अक्षर की तुलना कर रहे हैं, तो अपरिवर्तनीय होने पर उनका वही व्यवहार होता है। जब म्यूटेबल होने की बात आती है तो जावा और सी में स्ट्रिंग ऑब्जेक्ट्स का भी वही व्यवहार होता है।

यहाँ एक उदाहरण तथ्य स्ट्रिंग एक प्रति है कि प्रदर्शित है: सी ++ परिवर्तनशील हैं

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    const char *ptr = "hello"; 
    string s = ptr; 

    s[0] = 'b'; 

    cout << s << endl; //prints bello 
    cout << ptr << endl; //prints hello 

    return 0; 
} 
+1

कृपया बताएं कि स्ट्रिंग अक्षर द्वारा आपका क्या मतलब है अपरिवर्तनीय नहीं है। मेरा मतलब है, एक स्ट्रिंग शाब्दिक में डबल कोट्स में कुछ भी, है ना? और उदाहरण में मैंने प्रदान किया, हमने इसे बदल दिया। कृपया भाई को समझाओ। – abcde

+1

हां, डबल कोट्स में कुछ भी एक स्ट्रिंग अक्षर है। यह स्ट्रिंग स्मृति के केवल पढ़ने के हिस्से में संग्रहीत है। इसलिए यह अपरिवर्तनीय है क्योंकि आप इस स्मृति को नहीं लिख सकते हैं। आपके द्वारा प्रदान किए गए उदाहरण में, आपने स्ट्रिंग अक्षर को म्यूट नहीं किया था। आपने स्ट्रिंग ऑब्जेक्ट में संग्रहीत किया गया था इसकी एक प्रति उत्परिवर्तित की। मैं एक उदाहरण टाइप करूंगा जो इस अवधारणा को सुपर स्पष्ट बनाता है। – Kacy

+0

घोषणा 'char * ptr = "हैलो"; 'अमान्य है। –

0

स्ट्रिंग्स, लेकिन महान शक्ति के साथ बड़ी जिम्मेदारी आता है: अगर आप से पढ़ने के लिए या करने के लिए की दुकान आप अपरिभाषित व्यवहार मिल जाएगा स्ट्रिंग मेमोरी जो सीमा से बाहर है। उदाहरण के लिए, यदि आपने एस [12] को संदर्भित किया है, तो आपको अपरिभाषित व्यवहार मिलेगा।

0

सी ++ std::string उत्परिवर्तनीय और असाइनमेंट (आमतौर पर) स्ट्रिंग डेटा की प्रतिलिपि बनाता है। जावा String अपरिवर्तनीय है और असाइनमेंट स्ट्रिंग का संदर्भ प्रतिलिपि बनाता है।

टाइप std::shared_ptr< const std::string > जावा स्ट्रिंग की तरह कुछ डिग्री है। हालांकि, यह एक गरीब आदमी का विकल्प है। सी ++ 03 में यह अनुकूलन के लिए प्रासंगिक था उदा। स्ट्रिंग्स के संग्रह को सॉर्ट करना, लेकिन सी ++ 11 मूव सेमेन्टिक्स के साथ यह अकादमिक पीओवी को छोड़कर – के लिए अब इतना प्रासंगिक नहीं है।

6

सी ++ स्ट्रिंग शाब्दिक, जैसे कि, "literal" की तरह कुछ हालांकि सी ++ 03 अनुमति एक char* लिए इस तरह के एक शाब्दिक के सूचक के बताए (इस विशेषाधिकार पदावनत और के लिए सी ++ 11 हटा दिया गया था) अपरिवर्तनीय हैं। एक स्ट्रिंग शाब्दिक के एक चरित्र बदलने की कोशिश कर अपरिभाषित व्यवहार है:

char* s = "literal"; // OK with C++03; illegal with C++11 and later 
s[0] = 'x';   // undefined behavior 

सी ++ std::string वस्तुओं निश्चित रूप से यह सोचते हैं कि वे std::string const के रूप में घोषित नहीं कर रहे हैं परिवर्तनशील हैं।यदि आप एक दूसरे से स्वतंत्र होने के लिए char ऑब्जेक्ट्स के अनुक्रम पर विचार करते हैं तो अलग-अलग ऑब्जेक्ट्स को असाइन करना ठीक है। हालांकि, यह काफी आम है कि तारों में वास्तव में यूटीएफ -8 बाइट्स के रूप में एन्कोड किए गए यूनिकोड होते हैं। यदि स्ट्रिंग के किसी भी तत्व को बदलने का मामला उचित एन्कोडिंग को नष्ट कर सकता है, उदाहरण के लिए, क्योंकि निरंतर बाइट किसी और चीज से बदल जाता है।

तो, हाँ, तार विचलित हैं लेकिन यह व्यक्तिगत तत्वों को असाइन करने के लिए एक अर्थपूर्ण दृष्टिकोण से सुरक्षित नहीं हो सकता है।

संबंधित मुद्दे