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?
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.
}
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..
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()
.
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
// ...
}
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
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()) ...