Einführung in C++

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 stdnicht 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.

Links