web-dev-qa-db-fra.com

std :: string vs string en c ++

Doublons possibles:
Pourquoi "utiliser namespace std;" est-il considéré comme une mauvaise pratique en C++?
tilisation de l'espace de noms std

J'ai plané autour d'un tas de forums différents et je semble voir cela apparaître à chaque fois. C'est une question très débutante.

Je définis généralement un programme avec

#include<string>
using namespace std;

string x;

Je vois un tas d'échantillons de code qui définissent une chaîne comme

std::string.

Quel en est le but? est-ce une bonne pratique ou une fonctionnalité?

48
OVERTONE

Comme l'autre réponse l'a déjà dit, en utilisant std:: est nécessaire sauf si vous importez l'ensemble de l'espace de noms std ou std::string (voir ci-dessous).

À mon avis, il est plus agréable d'utiliser std::string au lieu de string car cela montre explicitement qu'il s'agit d'un std::string et pas une autre implémentation de chaîne.

Si vous préférez écrire seulement string, je vous suggère d'utiliser using std::string; au lieu de using namespace std; pour importer uniquement les éléments dans l'espace de noms global dont vous avez réellement besoin.

44
ThiefMaster

Le nom complet de string est std::string car il réside dans namespace std, l'espace de noms dans lequel résident toutes les fonctions, classes et objets de la bibliothèque standard C++.

Dans votre code, vous avez explicitement ajouté la ligne using namespace std;, qui vous permet d'utiliser n'importe quoi depuis l'espace de noms standard sans utiliser le std:: préfixe. Ainsi, vous pouvez vous référer à std::string (le vrai nom du type de chaîne) en utilisant le raccourci string puisque le compilateur sait regarder dans namespace std pour ça.

Il n'y a pas de différence de fonctionnalité entre string et std::string car ils sont du même type. Cela dit, il y a des moments où vous préférez std::string sur string. Par exemple, dans un fichier d'en-tête, il n'est généralement pas considéré comme une bonne idée de mettre la ligne using namespace std; (ou pour utiliser n'importe quel espace de noms, d'ailleurs) car cela peut rendre ambigu les noms des fichiers qui incluent cet en-tête. Dans cette configuration, vous devez simplement #include <string> dans l'en-tête, puis utilisez std::string pour faire référence au type de chaîne. De même, s'il y a jamais eu une ambiguïté entre std::string et un autre type string, utilisant le nom std::string supprimerait l'ambiguïté.

Que vous incluiez ou non la ligne using namespace std; est un sujet quelque peu contesté et de nombreux programmeurs y sont fortement ou fortement opposés. Je suggère d'utiliser tout ce qui vous convient et de vous assurer d'adopter les conventions de codage utilisées lorsque vous travaillez sur un grand projet.

13
templatetypedef

Comme ssteinberg l'a dit, c'est la même chose. Mais seulement syntaxiquement.

D'après mon expérience, il est plus utile d'utiliser le nom complet

std::string 

où vous en avez besoin, ou ajoutez une explicite

using std::string;

au début de votre fichier source.

L'avantage est que de cette manière les dépendances de votre fichier source sont plus observables. Si vous ajoutez un

using namespace std;

cela signifie que votre code peut dépendre de tout ce qui se trouve dans cet espace de noms.

4
Assambar

S'ils ne sont pas using le namespace std, puis ils doivent spécifier à quelle chaîne d'espace de noms appartient en utilisant std::string

1
MByD

Si tu as using namespace std; devant votre code c'est pareil.

0
ssteinberg