2010-04-15 13 views
9

pour l'utilisation cout, je dois spécifier:comprennent et en utilisant l'espace de noms en C++

#include<iostream> 

et

using namespace std; 

Où est cout défini? dans iostream, correct? Donc, c'est que iostream lui-même est là dans l'espace de noms std?

Quelle est la signification des deux instructions en ce qui concerne l'utilisation de cout?

Je suis confus pourquoi nous avons besoin de les inclure tous les deux.

+5

@Neil Alors, quel est le but de SO? Pour ne poser que des questions qui n'ont aucun moyen d'y répondre en lisant un livre ou en cherchant sur Internet? –

+1

@Neil Butterworth: d'accord! pas plus de questions stupides après celui-ci, sans lire les concepts d'un livre. – Moeb

+6

@Kevin Toute personne qui pense pouvoir apprendre le C++ en posant des questions sur SO se trompe et perd son temps. –

Répondre

9

iostream est le nom du fichier dans lequel cout est défini. D'un autre côté, std est un espace de noms, équivalent (dans un certain sens) au paquet de Java.

cout est une instance définie dans le fichier iostream, à l'intérieur de l'espace de noms std.

Il peut exister une autre instance cout dans un autre espace de noms. Pour indiquer que vous souhaitez utiliser l'instance cout à partir de l'espace de noms std, vous devez écrire

std::cout, en indiquant l'étendue.

std::cout<<"Hello world"<<std::endl; 

Pour éviter le std:: partout, vous pouvez utiliser la clause using.

cout<<"Hello world"<<endl; 

Ce sont deux choses différentes. L'un indique la portée, l'autre fait l'inclusion réelle de cout.

En réponse à votre commentaire

Imaginez que, dans iostream deux instances nommées cout existe, dans les différents espaces de noms

namespace std{ 
    ostream cout; 
} 
namespace other{ 
    float cout;//instance of another type. 
} 

Après y compris <iostream>, vous auriez encore besoin de spécifier l'espace de noms. La déclaration #include ne dit pas "Hey, utilisez le cout dans std ::". C'est ce que using est pour, pour spécifier la portée

+1

@Tom: Lorsque j'ai déjà inclus le fichier ('iostream'), j'ai spécifié quelle définition de' cout' utiliser. Maintenant, le compilateur sait quelle définition utiliser. Alors, quel est le problème alors. Je suis encore confus quant à la raison pour laquelle je dois dire que c'est dans l'espace de noms 'std'. Cela aurait dû être nécessaire s'il y avait une certaine confusion. Ici, il n'y a pas de confusion car il n'y a qu'une seule définition de «cout». – Moeb

+0

Veuillez voir ma réponse mise à jour – Tom

+0

@cambr: Non, vous avez spécifié une définition de 'cout' à utiliser. Il n'y a pas de raison pour que vous ne puissiez pas définir 'int cout 'par la suite, bien que ce ne soit pas une bonne idée. On peut soutenir que la norme C++ aurait pu exiger que les espaces de noms soient ignorés s'il n'y a qu'un seul espace de noms avec un symbole donné, mais ce n'est pas le cas et je ne peux pas penser à un langage utilisant des espaces de noms. –

1

cout est logiquement défini dans iostream. Par logiquement, je veux dire qu'il peut être dans le fichier iostream ou il peut être dans un fichier inclus dans iostream. De toute façon, y compris iostream est le moyen correct d'obtenir la définition de cout.

Tous les symboles de l'iostream se trouvent dans l'espace de noms std. Pour utiliser le symbole cout, vous devez indiquer au compilateur comment le trouver (c'est-à-dire quel espace de noms). Vous avez deux choix:

// explicit 
std::cout << std::endl; 

// import one symbol into your namespace (other symbols must still be explicit) 
using std::cout; 
cout << std::endl; 

// import the entire namespace 
using namespace std; 
cout << endl; 

// shorten the namespace (not that interesting for standard, but can be useful 
// for long namespace names) 
namespace s = std; 
s::cout << s::endl; 
0

Les références #include <iostream> le fichier d'en-tête qui définit Cout. Si vous allez utiliser cout, alors vous aurez toujours besoin de l'inclure.

Vous n'avez pas besoin de using namespace std;. Cela vous permet simplement d'utiliser les raccourcis cout et endl et autres, plutôt que std::cout et std::endl où l'espace de noms est explicite. Personnellement, je préfère ne pas utiliser using namespace ..., car il faut que je sois explicite dans mon sens, même si c'est plus bavard.

+1

Le compromis est 'l'utilisation de std :: cout; en utilisant std :: endl; ', après quoi vous pouvez utiliser' cout' et 'endl' sans qualification, sans amener tout l'espace de noms' std' dans l'espace de noms global. –

2

Si votre implémentation C++ utilise des fichiers d'en-tête de style C (beaucoup le font) alors il y a un fichier qui contient quelque chose de similaire à:

#include ... // bunches of other things included 

namespace std { 

... // various things 

extern istream cin; 
extern ostream cout; 
extern ostream cerr; 

... // various other things 

} 

std est l'espace de noms que la norme C++ affirme que la plupart des choses standard devrait Il s'agit de ne pas surpeupler l'espace de noms global, ce qui pourrait vous causer des difficultés à trouver des noms pour vos propres classes, variables et fonctions qui ne sont pas déjà utilisées comme noms pour des choses standard.

En disant

using namespace std; 

vous dites au compilateur que vous voulez qu'il recherche dans l'espace de noms std en plus de l'espace de noms global lors de la recherche des noms. Si le compilateur voit la ligne de source:

return foo(); 

quelque part après la ligne using namespace std; il va chercher foo dans divers espaces de noms différents (semblable aux étendues) jusqu'à ce qu'il trouve une foo qui répond aux exigences de cette ligne. Il recherche les espaces de noms dans un certain ordre. D'abord, il regarde dans la portée locale (qui est vraiment un espace de nommage sans nom), puis la portée la plus locale suivante jusqu'à plusieurs fois jusqu'à l'extérieur d'une fonction, puis aux choses nommées de l'objet (méthodes, dans ce cas), puis noms globaux (fonctions, dans ce cas à moins que vous n'ayez été stupide et surchargé() et que j'ignore), et ensuite à l'espace de noms std si vous avez utilisé la ligne using namespace std;. Je peux avoir les deux derniers dans le mauvais ordre (std peut être recherché avant global), mais vous devriez éviter d'écrire du code qui en dépend.