# C++ Anfaengerproblem  "using namespace std"



## greynox (24. März 2011)

Hallo Leute,
ich lerne, mit einem Buch "jetzt lerne ich C++"  C++.
Darin steht folgende Uebung:

1.Formulieren Sie das Hallo Welt-Programm ohne die using-Anweisung zur Einbindung des std-Namensraums.

Jetzt weis ich aber nicht, ob ich etwas richtig gemacht habe.
Mein Code sieht so aus:

/***********
 * Hallo Welt-Programm
 *
 * gibt einen Gruss auf den Bildschirm aus
 */

#include <iostream>
#include <string>

int main()
{
	std::string gruss;

	gruss = "Hallo Bastian!";
	std::cout << gruss << std::endl;

	std::cin.get();

	return 0;
}

Kompiliert mit Visual c++.
Das Programm funktioniert, die *.exe ****t auch.
Ich glaube, eigentlich duerfte es doch garnicht funktionieren oder?
Bin etwas verwirrt. Hehe.
Vielen Dank fuer jede Hilfe.


----------



## Tim Bureck (24. März 2011)

Wie kommst du darauf, dass es nicht funktionieren dürfte? 

Mit den Namespaces verhält es sich prinzipiell wie mit Adressen. Sie sind ein Wegweiser (in dem Fall für Compiler und Programmierer) um an einen bestimmten Typ, eine bestimmte Funktion oder sonstiges zu kommen, sowie man mit Postleitzahl und Straße/Hausnummer eine bestimmte Person/Familie adressieren kann. 

So. Wie du einen Namespace ansprechen kannst, hast du oben im Quelltext (den du übrigens in [code=cpp][/code]-Tags schreiben solltest, damit man's besser lesen kann) bereits erkannt und eingesetzt. Was ist nun der Unterschied zur using-Anweisung?


```
using namespace std;

...

string gruss;
gruss = "Hallo Welt!";
cout << gruss << endl;
```

Du kannst den Namespace vor jedem Bezeichner in diesem Namespace weglassen. Das ist in etwa so wie die Post vielleicht einen Behälter hat, auf dem steht "Hier alle Pakete nach Berlin" oder so ähnlich. 

Hoffe es ist klar geworden.

Best regards


----------



## greynox (25. März 2011)

Danke erst mal.
Ehrlich gesagt, hat es bei mir noch nicht ganz klick gemacht.
Mir ist der Unterschied nicht ganz klar. Kannst du mir vieleicht noch ein Beispiel mit den Unterschieden nennen, wann man welche schreibweise benutzt?


----------



## vfl_freak (25. März 2011)

Moin,

Du kannst gleichnamige Funktionen/Datentypen etc. aus unterschiedlichen _NameSpaces_ aufrufen :

```
// entweder 
using namespace std;
using namespace xyz;

string sGruss1;
string sGruss2;
cout( .... );
cout( .... );

// oder 
std::string sGruss1;
xyz::string sGruss2;
std::cout( .... );
xyz::cout( .... );
```

Das macht immer dann Sinn, falls sich bspw. std::string und xyz::string resp. std::cout und xyz::cout in irgendeiner Form unterscheiden!
(Das ist hier nur auf die Schnelle beispielhaft geschrieben !!)

Inhaltlich sind Deine Schreibweise und die von Tim Bureck identisch.
Beim ihm wird der NameSpace halt global festgelegt und muss dann nicht jedesmal vor die Variable/Funktion geschrieben werden !

Gruß
Klaus

Gruß
Klaus


----------



## sheel (25. März 2011)

Hi

Die Funktionen, Variablentypen (Klassen) etc sind in verschiedene Bereiche eingeteilt.

(Nicht reales) Beispiel:
Ein Bereich Rechnen mit Funktionen wie Plus und Minus
und ein Bereich Eingabe mit inteinlesen, floateinlesen...
und Ausgabe mit intausgeben, floatausgeben...

Je nach Sinn (oder sonst irgendwie) sind in C++ viele Dinge in diese Bereiche, sog. Namespaces, eingeteilt.
cout zum Beispiel ist im Namespace std (steht sicher für Standard)
string steht auch in std

Es gibt auch Dinge ohne Namespace, die sind eben außerhalb von allen.
Schachteln kann man solche Namespaces übrigens auch.

Wenn man jetzt einfach cout verwenden würde, würde der Compiler in den Namespacefreien Bereichen nach cout suchen. Da es dort kein cout gibt: Fehler. Man muss angeben, dass man das cout aus std meint: Also std::cout.

Da liegt übrigens ein Vorteil der Namespaces: Es kann in verschiedenen Namespaces mehrere verschiedene cout ... geben; man muss nicht immer aufpassen, ob irgendein Name schon woanders vorkommt.

Also, std::cout.
Wenn man keinen Namespace angibt, ist immer der freie/globale Bereich gemeint.

Und für was jetzt using?
Mit "using namespace ...;" teilt man dem Compiler mit, dass er in der betreffenden Quellcodedatei nicht nur den Namespacefreien Bereich, sondern auch den Namespace ... durchsuchen soll, wenn da einfach cout steht.
Mit einem einzelnen "using namespace std;" kann man sich also alle "std::" in der Datei sparen.
Spart Schreibarbeit.

Gruß

PS: Zu spät...


----------



## Muepe32 (26. März 2011)

Beim Thema using namespace erwähne ich gerne, dass man schauen sollte ob es wirklich eine gute Idee ist einen Namespace einzubinden - wirklich! 

Gängige Namespaces haben viele Objekte die schnell zu Verwechslungen führen können. So gibt es im std-Namespace Objekte wie count, sort, find, ... . Das sind sehr allgemeine Namen. Ich habe bisher bessere Erfahrungen gemacht indem ich nur gewisse Elemente daraus einbinden mit der using-Direktive.

Beispiel:

```
#include <iostream>

int main()
{
   using std::cout;
   using std::cin;
   using std::endl;

   int a = 0;
   cout << "a = ";
   cin >> a;

   cout << "a = " << a << endl;

   return 0;
}
```


----------



## greynox (5. April 2011)

Hallo Leute, sorry das ich jetzt erst antworte. 
Vielen dank für eure Beiträge. Jetzt hats klick gemacht.


----------

