In dieser Einführung in die Programmiersprache C++ werden anhand eines simplen Programms einige Grundlagen zu C++ vermittelt. Dabei greife ich ein Beispiel aus den Artikeln zur Einrichtung einer C++-Programmierumgebung auf (Links am Ende dieses Artikels). Es handelt sich dabei um ein schlichtes Hello-World-Programm:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!\n";
return 0;
}
Die Funktion main()
Auf dieses kleine Beispiel möchte ich nun genauer eingehen. Zunächst werfen wir einen Blick auf die Funktion main()
. Diese Funktion ist der Einstiegspunkt einer C++-Anwendung. Sämtlicher Code, der innerhalb der geschweiften Klammern — dem Funktionskörper — geschrieben wird, wird ausgeführt, hier also
cout << "Hello, World!\n";
return 0;
Jede Zeile Code muss mit einem Semikolon beendet werden, andernfalls bricht die Kompilierung mit einer Fehlermeldung ab, die in Visual Studio so aussieht:
Fehler (aktiv) E0065 Es wurde ein ";" erwartet.
Fehler C2143 Syntaxfehler: Es fehlt ";" vor "}"
Die Zeile
return 0;
bedeutet, dass diese Funktion die Zahl 0 zurückgibt, was soviel wie „es ist alles ok“ meint. Die Rückgabe eines Wertes, hier eine Ganzzahl (Integer), wird im Funktionskopf
int main()
dadurch gekennzeichnet, dass vor dem Funktionsnamen main
der Datentyp des zurückzugebenden Wertes (hier: int
für Integer) angegeben wird.
In manchen Tutorials wird dieses Hello-World-Beispiel ohne return 0;
dargestellt. Dies ist kein Fehler, denn in der main()
-Funktion — und nur in der main()
-Funktion — darf die Rückgabe des Wertes fehlen, obwohl vor dem Funktionsnamen main
ein Rückgabewert angegeben ist. Folgender Code würde also ebenfalls fehlerfrei ausgeführt werden:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!\n";
}
Ausgabe in der Konsole
Dieses Programm hat nur eine Aufgabe: Die Ausgabe von “Hello, World!” in der Konsole. Möglich wird dies durch cout
(character output). Dieses cout
erhält über den Operator <<
(insertion operator) die auszugebende Zeichenkette (String), die in doppelte Anführungszeichen gesetzt wird.
Bei cout
handelt es sich um den Standardausgabestrom. Diesem cout
ist es zu verdanken, dass — wie hier — eine Zeichenkette übergeben werden kann, ohne dass man sich noch darum kümmern müsste, wie die Ausgabe erfolgen soll.
Zusätzlich zum auszugebenden Text “Hello, World!” folgen die Zeichen \n
und selbstverständlich ein die Code-Zeile abschließende Semikolon.
\n und endl
Bei \n
handelt es sich um eine Escape-Sequenz. Sie bewirkt einen Zeilenumbruch (new line).
Neben der Verwendung von \n
gibt es noch den Manipulator endl
, der ebenfalls einen Zeilenumbruch bewirkt. Ein Manipulator verändert das Verhalten des Ausgabestroms. Hier erfolgt dies dergestalt, dass am Ende der Zeichenkette ein Zeilenumbruch erzeugt wird.
include und std
Auf die ersten beiden Zeilen dieses Hello-World-Programms bin ich noch nicht eingegangen: #include <iostream>
und using namespace std;
.
Bei include
handelt es sich um eine Direktive des Präprozessors. Damit hat es folgendes auf sich: Der Quellcode wird vom Compiler in Maschinensprache übersetzt (kompiliert). Vor diesem Vorgang des Kompilierens kommt der Präprozessor zum Einsatz. Er durchsucht den Quellcode nach an ihn gerichtete Anweisungen. Dies sind unter anderem include
-Anweisungen, mit der andere Dateien eingebunden werden sollen. In diesem Fall also iostream
, das alle notwendigen Informationen zu cout
und endl
enthält. Denn bei iostream
handelt es sich um eine Bibliothek, die alle Objekte betreffend des Ein- / Ausgabestroms beinhaltet. Oder anders ausgedrückt: Würden wir iostream nicht einbinden, dann könnte hier kein Text über cout
an den Standardausgabestrom übergeben werden. Und auch der Zeilenumbruch mithilfe von endl
wäre nicht möglich.
Betrachten wir zum Schluss noch die Zeile
using namespace std;
Bei std
handelt es sich um einen Namensbereich und zwar steht er für die Standardbibliothek von C++ (std
= standard). Die Definition von cout
und endl
gehört zu diesem Namensbereich. Dieses Prinzip findet sich auch in anderen Programmiersprachen. Damit ist es möglich, ein eigenes cout
zu verwenden, sofern es Teil eines anderen Namensbereichs ist.
Würde man den Namensbereich — so wie hier std
— nicht explizit am Anfang des Quellcodes aufführen, dann wäre es erforderlich vor den entsprechenden Elementen std
hinzuzufügen, gefolgt von zwei Doppelpunkten, zum Beispiel:
std::cout
Da in diesem Beispiel der Namensbereich std
angeben wird, sucht der Compiler automatisch in diesem Namensbereich nach cout
und anderen Elementen der Standardbibliothek von C++.
Fazit
Alle Bestandteile dieses sehr kleinen Programms sind damit erklärt; und es ist schon erstaunlich, wieviel Aufwand betrieben werden muss, um “Hello, World!” auszugeben, gerade wenn man es beispielsweise mit Python vergleicht, wo die Zeile
>>> print(Hello, World!)
vollkommen ausreicht.
Bei kleinen Programmen hat man in einer Hochsprache wie C++ also mit einem Overhead zu kämpfen. Demgegenüber bietet diese Sprache aber auch zahlreiche Vorteile, wie die Möglichkeit, plattformübergreifende Anwendungen zu entwickeln oder die hohe Skalierbarkeit.