web-dev-qa-db-fra.com

Initialisation des chaînes en tant que null vs chaîne vide

En quoi le code C++ (comme indiqué ci-dessous) contient-il une chaîne initialisée en tant que chaîne vide?

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

vs non/initialisation nulle:

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

Y a-t-il des meilleures pratiques ou des pièges à ce sujet?

37
Saket

Il y a une fonction empty() prête pour vous dans std::string:

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

ou

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.
}
65
SingerOfTheFall

Il n'y a pas de pièges. La construction par défaut de std::string est "". Mais vous ne pouvez pas comparer une chaîne à NULL. Le plus proche que vous puissiez obtenir est de vérifier si la chaîne est vide ou non, en utilisant le std::string::empty méthode..

20
juanchopanza

Meilleur:

 std::string subCondition;

Cela crée une chaîne vide.

Cette:

std::string myStr = "";

effectue une initialisation de copie - crée une chaîne temporaire à partir de "", puis utilise le constructeur de copie pour créer myStr.

Prime:

std::string myStr("");

effectue une initialisation directe et utilise le constructeur string(const char*).

Pour vérifier si une chaîne est vide, utilisez simplement empty().

14
Luchian Grigore

Vide et nullité sont deux concepts différents. Comme d'autres l'ont mentionné, le premier peut être obtenu via std::string::empty(), le dernier peut être obtenu avec boost::optional<std::string>, par exemple.:

boost::optional<string> myStr;
if (myStr) { // myStr != NULL
    // ...
}
6
Adam Romanek

Je préférerais

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

De plus, vous n'avez pas à écrire std::string a = "";. Vous pouvez simplement écrire std::string a; - il sera vide par défaut

3
Andrew

Le constructeur par défaut initialise la chaîne sur la chaîne vide. C'est la manière la plus économique de dire la même chose.

Cependant, la comparaison avec NULL pue. C'est une syntaxe plus ancienne encore d'usage courant qui signifie autre chose; un pointeur nul. Cela signifie qu'il n'y a pas de ficelle autour.

Si vous voulez vérifier si une chaîne (qui existe) est vide, utilisez plutôt la méthode empty:

if (myStr.empty()) ...
1
Jirka Hanika