chaîne d'initialiser la valeur NULL en C++
string a=NULL;
il donne une erreur. Pourquoi et comment puis-je initialiser la chaîne NULL?
mais quand j'écris
string a="foo";
ce qu'il fonctionne très bien.
string a = "";
essayez d'utiliser le pointeur, vous pouvez affecter
NULL
, mais n'oubliez pas d'utiliser correctement new
et delete
Quel est le problème avec
string a;
?Rien, en fait, il est probablement mieux.
OriginalL'auteur user1559792 | 2012-12-16
Vous devez vous connecter pour publier un commentaire.
Fait pour obtenir un vide
std::string
, il vous suffit d'écrirestd::string
'constructeur par défaut vous donnera une chaîne vide sans donner d'autres indications.Que d'un côté, en utilisant la valeur NULL en C++ est généralement déconseillée, la recommandation serait d'utiliser soit 0 (NULL tend à être définie de toute façon) ou si vous avez une assez moderne compilateur,
nullptr
.nullptr
sera UB, il va essayer de construire unstd::string
à partir d'un pointeur null, ce qui n'est pas autorisé par la Norme.Je pense que "en aparté" signifie qu'il ne s'applique pas à cette situation.
En aparté, je ne vois pas comment à l'aide de
NULL
est déconseillé en pré-nullptr
C++... dans la pratique c'est le même que0
(c'est la garantie d'être défini, 0), et il fait plus clair que nous parlons pointeurs.il va appeler
foo(char*)
oufoo(int)
? Vous diraisfoo(char*)
parce queNULL
est utilisé pour les pointeurs, mais c'est en fait l'appelfoo(int)
. Un code clair, est important. Ne jamais utiliserNULL
en C++.non, je dirais
foo(int)
parce que je queNULL
est de la plaine de zéro. Mais si je fais l'erreur et, plus tard, quelqu'un d'autre avis que le mal de surcharge est appelé il peut tout de suite comprendre ce que je voulais dire et ajoutez le cast (sinon, il aurait à me demander si je voulais dire "entier zéro" ou "pointeur à zéro"). Je suis d'accord queNULL
est un botch -nullptr
a été introduit pour une raison, mais je pense que c'est mieux que l'utilisation de 0 également pour les pointeurs. De toute façon, tout cela est à la fois non pertinents à la question (je suis désolé de faire dérailler) et non pertinents, en général, maintenant quenullptr
résout ce problème.OriginalL'auteur Timo Geusch
Il y a une différence entre null et chaîne vide (une chaîne vide est toujours une chaîne valide). Si vous voulez un "nullable" objet (quelque chose qui peut contenir au plus un objet d'un certain type), vous pouvez utiliser
boost::optional
:OriginalL'auteur
Examinons ce que vous êtes en fait en train de faire:
D'abord vous exécutez
string a
. Cela crée un nouvel objet sur la pile, avec la valeur par défaut (une chaîne vide). Puis vous exécuteza=NULL
, qui appelle la fonction affectation de la classe string. Mais qu'est-ce queNULL
?NULL
en C++ est une macro développée en seulement0
. Si vous êtes attepting à affecter un entier à unstring
variable, qui n'est évidemment pas possible.fonctionne, parce que vous souhaitez affecter un tableau de char, et le
string
classe a de l'opérateur d'affectation de la méthode surchargée pour des tableaux de char, mais pas pour les entiers. C'est pourquoiNULL
ne fonctionne pas et "abc".En C,
NULL
est défini comme((void*)0)
mais en C++ sa juste0
.std::string a = NULL;
est une phase d'initialisation, pas une cession.operator=
n'est pas appelé (ou du moins pas directement, en fonction de la mise en œuvre).pas de. C'est un tableau de caractères. Il se désintègre à un pointeur, et la façon dont le pointeur est stocké (si elle est stockée à tous) est mise en œuvre définies. Il peut être un nombre à virgule flottante sur la folle architectures.
un pointeur est convertible en une valeur numérique, comme int ou long, mais c'est un type distinct. C'est une grosse différence.
OriginalL'auteur Jakub Zaverka