2012-07-19 11 views
26

Wie wäre es, wenn meine C++ Code (siehe unten) eine Zeichenfolge als eine leere Zeichenfolge initialisiert hat:Initialisierung Zeichenfolge als null gegen leere Zeichenfolge

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

vs. no/null Initialisierung:

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

Gibt es irgendwelche Best Practices oder Fehler?

+9

'NULL' (konzeptionell) ist ein Zeiger und sollte nur als solcher verwendet werden. Ein 'std :: string' ist kein Zeiger, daher sollte er nicht kombiniert werden. PS. Die Initialisierungen sind die gleichen: der ctor von 'std :: string' setzt ihn auf die leere Zeichenkette. – MSalters

+0

@MSalters Hallo, ich stimme deinem Punkt zu, aber wenn der Typ inkompatibel zu sein scheint, wirft der Compiler keinen Fehler. Ich habe VS 2010 und es initialisiert die std :: string automatisch mit NULL. –

+1

@Surfing_SO: Es gibt einen Zeichenkettenkonstruktor, der einen Zeiger auf ein Array von Zeichen nimmt, das durch ein Nullzeichen beendet wird. Sie haben einen solchen Zeiger nicht korrekt übergeben (NULL zeigt nicht auf ein Array von Zeichen oder irgendetwas anderes). Dies ist Undefined Behavior und alles kann in diesem Fall passieren. – MSalters

Antwort

48

Es gibt eine Funktion empty() für Sie bereit, in std::string:

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

oder

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' ist die Antwort von allem. Sie haben es richtig gemacht –

2

würde ich

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

Auch müssen std::string a = ""; nicht schreiben. Sie können nur std::string a; schreiben - es wird standardmäßig

17

Es sind keine gotchas leer sein. Der Standardaufbau von std::string ist "". Aber Sie können eine Zeichenfolge nicht mit NULL vergleichen. Die nächstgelegene Sie erhalten können, ist zu prüfen, ob der String leer ist oder nicht, mit der std::string::empty Methode ..

+0

Es gibt zusätzliche temporäre beim Erstellen von 'std :: string' und Zuweisen von' "" zu ihm. – vladon

+0

@vladon Ich bin mir nicht sicher, auf welches Temporär Sie sich beziehen oder wie die Zuweisung relevant ist. Ich kann kein temporäres in 'a =" "sehen;' wenn 'a' 'std :: string' ist, aber die Frage ist nicht. – juanchopanza

10

Best:

std::string subCondition; 

Dies schafft eine leere Zeichenfolge.

Dies:

std::string myStr = ""; 

macht eine Kopie der Initialisierung - erstellt eine temporäre Zeichenfolge aus "", und verwendet dann den Copykonstruktor myStr zu erstellen.

Bonus:

std::string myStr(""); 

hat eine direkte Initialisierung und verwendet den string(const char*) Konstruktor.

Um zu überprüfen, ob eine Zeichenfolge leer ist, verwenden Sie einfach empty().

+0

würde nicht 'std :: string myStr =" ";' einen 'string (const char *)' Konstruktor aufrufen? Warum denkst du, dass ein temporärer erstellt wird? – Andrew

+0

@Andrew komisch, oder? http://stackoverflow.com/questions/11223285/whats-the-motivation-between-having-copy-and-direct-initialization-behave-diffe –

+0

+1 für den Link) – Andrew

1

Der Standardkonstruktor initialisiert die Zeichenfolge mit der leeren Zeichenfolge. Das ist die ökonomischere Art, dasselbe zu sagen. Der Vergleich mit NULL stinkt. Das ist eine ältere Syntax, die immer noch gebräuchlich ist und etwas anderes bedeutet; ein Nullzeiger. Es bedeutet, dass es keine Schnur gibt.

Wenn Sie überprüfen wollen, ob eine Zeichenfolge (das nicht vorhanden ist) leer ist, verwenden Sie die empty Methode statt:

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

Leer-ness und „NULL-ness“ sind zwei unterschiedliche Konzepte. Wie bereits erwähnt, kann das erstere über std::string::empty() erreicht werden, letzteres kann erreicht werden mit boost::optional<std::string>, z.B.:

boost::optional<string> myStr; 
if (myStr) { // myStr != NULL 
    // ... 
} 
Verwandte Themen