3
votes

Pourquoi n'avons-nous pas besoin d'objets pour stocker des données de chaîne?

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?


2 commentaires

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 .


3 Réponses :


3
votes

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:

Copier l'initialisation

std :: string constructors

std :: basic_string :: operator =


3 commentaires

Notez que l'affectation fonctionne également: str = "DEF"; .


Donc, "ABC" est juste l'argument char const?


@AtharvaPatwardhan Oui.



2
votes

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) {}


2 commentaires

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.



0
votes

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")


0 commentaires