En C ++, si string est une classe, pourquoi n'avons-nous pas besoin de l'opérateur point ou d'un objet pour stocker les données dans une chaîne?
Chaîne classique:
str.length();
Pourquoi pouvons-nous passer directement ABC en utilisant "" au lieu de le faire comme
string str; str.data = "ABC";
Mais nous devons utiliser des objets pour accéder aux fonctions. Exemple:
string str = "ABC";
Pourquoi faisons-nous cela?
La chaîne est-elle une classe particulière?
3 Réponses :
string str = "ABC";
n'est pas une affectation. C'est de la construction. Plus précisément, il appelle le constructeur std :: string
en prenant un argument const char *
.
C'est la même que de faire
XXX
juste une syntaxe différente.
L'affectation fonctionne également. Vous faites ceci:
string str; str = "ABC";
Voir aussi:
Notez que l'affectation fonctionne également: str = "DEF";
.
Donc, "ABC" est juste l'argument char const?
@AtharvaPatwardhan Oui.
std :: basic_string a un constructeur comme celui-ci: XXX
Construit la chaîne avec le contenu initialisé avec une copie de la chaîne de caractères terminée par un nul pointé par s.
Mais le point important à noter est que ce constructeur n'est pas explicite
, ainsi le compilateur peut effectuer une conversion implicite d'une chaîne de caractères terminée par null pendant l'appel du constructeur.
Par exemple, le code suivant se compile sans aucun problème:
class Foo { public: Foo(int) {} }; int main() { Foo f = 10; }
Il ne se compilera pas si le constructeur est écrit comme suit:
explicite Foo (int) {}
Donc, si la valeur de la chaîne est l'argument char const et que le deuxième argument est principalement NULL, que dois-je affecter pour initialiser le deuxième argument? Je veux demander ce qui (si nécessaire) doit être passé en tant qu'allocateur const?
L'argument Seconds n'est pas nul, c'est celui par défaut. Tous les conteneurs standard sont des conteneurs compatibles avec les allocateurs, c'est-à-dire qu'ils nous donnent la possibilité de passer un allocateur personnalisé si celui par défaut ne nous convient pas. Vous n'avez pas à penser au paramètre d'allocateur à moins que vous ne fassiez des travaux vraiment avancés.
En C ++ , un littéral de chaîne n'est pas un std :: string
, mais un tableau de caractères de style C ( char [N ]
). Et oui std :: string
ou tout autre type de chaîne tiers que vous pouvez voir est une classe avec un constructeur de conversion acceptant des tableaux de caractères en entrée. Plus précisément, std :: string
est un alias de type pour une instansiation du template std :: basic_string
. En bref, avant de pouvoir faire quoi que ce soit avec une chaîne littérale, vous feriez mieux de la convertir en chaîne:
std :: string {"ABC"}. Size ()
p >
Ou vous devrez passer à l'API C qui n'est pas recommandée pour les débutants:
strlen( "ABC")
Dans ce cas, c'est un constructeur. Mais C ++ vous permet de surcharger les opérateurs qui peuvent donner l'impression que vous manipulez l'objet sans méthodes, mais ce n'est que du sucre syntaxique pour appeler des méthodes sur l'objet.
std :: string
n'est pas un type particulier de classe, c'est un type de classe très ordinaire. Je soupçonne que vous êtes familier avec une autre langue et que vous auriez intérêt à un bon livre .