2012-07-19 17 views
26

तार यह कैसे कोई फर्क होता अगर मेरी सी ++ कोड (नीचे के रूप में दिखाया गया है) एक स्ट्रिंग एक खाली स्ट्रिंग के रूप में प्रारंभ किया है:आरंभ के रूप में अशक्त बनाम रिक्त स्ट्रिंग

std::string myStr = ""; 
....some code to optionally populate 'myStr'... 
if (myStr != "") { 
    // do something 
} 

बनाम कोई/बातिल प्रारंभ:

std::string myStr; 
....some code to optionally populate 'myStr'... 
if (myStr != NULL) { 
    // do something 
} 

क्या इसके आसपास कोई सर्वोत्तम प्रथाएं या गठिया हैं?

+9

'न्यूल '(अवधारणात्मक) एक सूचक है, और इसका उपयोग केवल इस तरह किया जाना चाहिए। एक 'std :: string' एक सूचक नहीं है, इसलिए इसे संयुक्त नहीं किया जाना चाहिए। पुनश्च। प्रारंभिकरण समान हैं: 'std :: string' का ctor इसे खाली स्ट्रिंग पर सेट करता है। – MSalters

+0

@MSalters hi मैं आपके बिंदु से सहमत हूं लेकिन फिर यदि प्रकार असंगत प्रतीत होते हैं तो संकलक एक त्रुटि क्यों नहीं फेंकता है। मेरे पास वीएस 2010 है और यह चुपचाप std :: स्ट्रिंग को न्यूल के साथ प्रारंभ करता है। –

+1

@Surfing_SO: एक स्ट्रिंग कन्स्ट्रक्टर है जो शून्य अक्ष द्वारा समाप्त वर्णों की एक सरणी में पॉइंटर लेता है .. आपने गलत तरीके से ऐसे पॉइंटर को पास नहीं किया है (NULL वर्णों की सरणी को इंगित नहीं करता है, या कुछ और)। यह अनिर्धारित व्यवहार है और उस मामले में कुछ भी हो सकता है। – MSalters

उत्तर

48

वहाँ एक समारोह empty()std::string:

std::string a; 
if(a.empty()) 
{ 
    //do stuff. You will enter this block if the string is declared like this 
} 

या

std::string a; 
if(!a.empty()) 
{ 
    //You will not enter this block now 
} 
a = "42"; 
if(!a.empty()) 
{ 
    //And now you will enter this block. 
} 
+5

'42' सब कुछ का जवाब है। आपको यह सही मिला है –

2

मैं prefere होता

if (!myStr.empty()) 
{ 
    //do something 
} 

इसके अलावा, आप std::string a = ""; लिखने के लिए नहीं है। तुम बस std::string a; लिख सकते हैं - यह डिफ़ॉल्ट

17

में आप के लिए तैयार है कोई gotchas रहे हैं द्वारा खाली हो जाएगा। std::string का डिफ़ॉल्ट निर्माण "" है। लेकिन आप स्ट्रिंग की तुलना NULL से नहीं कर सकते।

std::string subCondition; 

यह कोई खाली स्ट्रिंग बनाता है: निकटतम आप प्राप्त कर सकते हैं ..

+0

'std :: string' का निर्माण करते समय और अस्थायी होने पर अतिरिक्त अस्थायी है। – vladon

+0

@vladon मुझे सच में यकीन नहीं है कि आप किस अस्थायी का जिक्र कर रहे हैं, या असाइनमेंट कैसे प्रासंगिक है। मैं 'a =" "में अस्थायी नहीं देख सकता; 'जब' a' 'std :: string' है, लेकिन सवाल इसके बारे में नहीं है। – juanchopanza

10

बेस्ट चाहे स्ट्रिंग खाली है या नहीं की जांच करने के std::string::empty विधि का उपयोग कर रहा है।

यह:

std::string myStr = ""; 

एक प्रति प्रारंभ करता है - "" से एक अस्थायी स्ट्रिंग बनाता है, और फिर myStr बनाने के लिए प्रति निर्माता का उपयोग करता है।

बोनस:

std::string myStr(""); 

एक सीधा प्रारंभ करता है और string(const char*) निर्माता का उपयोग करता है।

यह जांचने के लिए कि कोई स्ट्रिंग खाली है या नहीं, बस empty() का उपयोग करें।

+0

'std :: string myStr =" "नहीं होगा;' 'स्ट्रिंग (कॉन्स char *) 'कन्स्ट्रक्टर का आह्वान करें? आपको क्यों लगता है कि एक अस्थायी बनाया जाएगा? – Andrew

+0

@ एंड्रयू अजीब, है ना? http://stackoverflow.com/questions/11223285/whats-the-motivation-between-having-copy-and-direct-initialization-behave-diffe –

+0

लिंक के लिए +1) – Andrew

1

डिफ़ॉल्ट कन्स्ट्रक्टर स्ट्रिंग को खाली स्ट्रिंग में प्रारंभ करता है। यह वही बात कहने का अधिक आर्थिक तरीका है।

हालांकि, NULL की तुलना में तुलना। यह एक पुराना वाक्यविन्यास है जो अभी भी सामान्य उपयोग में है जिसका अर्थ कुछ और है; एक शून्य सूचक। इसका मतलब है कि चारों ओर कोई स्ट्रिंग नहीं है। दो अलग अवधारणाओं

if (myStr.empty()) ... 
5

खाली सत्ता और "शून्य सत्ता" कर रहे हैं:

आप की जाँच करने के लिए कि क्या एक स्ट्रिंग (जो मौजूद है) रिक्त है चाहते हैं, बजाय empty विधि का उपयोग करें। जैसा कि अन्य लोगों ने उल्लेख किया है कि पूर्व को std::string::empty() के माध्यम से हासिल किया जा सकता है, उत्तरार्द्ध boost::optional<std::string> के साथ प्राप्त किया जा सकता है, उदाहरण के लिए:

boost::optional<string> myStr; 
if (myStr) { // myStr != NULL 
    // ... 
} 
संबंधित मुद्दे