Einführung in C++ Kapitel 1 — Aller Anfang ist leicht

Am Beginn unseres Studiums der Programmiersprache C++ und objektorientierten Programmierens (OOP) sollen einige Anmerkungen stehen, um Dir den Start zu erleichtern. Da objektorientiertes Programmieren — wenn nicht Programmieren überhaupt — wahrscheinlich neu für Dich ist, wirst Du Dich mit einem Schwall neuer Ausdrücke und neuer Terminologie konfrontiert sehen. Das ist bei etwas Neuem immer der Fall, also laß Dich von all den neuen Dingen nicht einschüchtern! (Sie wissen bisweilen selbst nicht, was sie bedeuten sollen oder wie sie verwendet werden.) In jedem Kapitel werden wir einige neue Konzepte einführen und so wirst Du langsam die gesamte Sprache lernen.

Die Kapitel eins bis vier dieser Einführung konzentrieren sich auf die Neuerungen von C++, die nicht objektorientiert sind. Objektorientierte Programmiertechniken werden erst ab Kapitel fünf abgehandelt. Wenn Dich das mehr interessiert, kannst Du gleich dorthin vor- und dann je nach bedarf hierher zurückspringen.

Sogar die Kommentare sind in C++ verbessert

Beispielprogramm: KOMM.CPP

Die Datei KOMM.CPP dient als Beispiel einiger Neuerungen in C++. Wir werden die einzelnen neuen Konzepte separat, beginnend mit den Kommentaren, besprechen.

Ein C++ Kommentar beginnt mit dem Doppelschrägstrich "//" irgendwo in einer Zeile und kommentiert den Rest der Zeile aus. Das Ende der Zeile ist auch das Ende des Kommentars. Die alte Methode des Kommentierens nach ANSI-C Standard kann in C++ auch verwendet werden, wie unter anderem aus den Zeilen 11 bis 14 ersichtlich ist. Die neue Definition des Kommentars ist die bevorzugte Methode, da es nunmehr unmöglich ist, unabsichtlich mehrere Zeilen Code auszukommentieren. Das kann passieren, wenn man das Ende des Kommentarblocks ("*/") beim alten C Kommentar vergißt. Guter Programmierstil ist es daher, die neue Art für alle Kommentare zu verwenden und die alte Methode nur zu verwenden, um bei der Fehlersuche eine größere Codesequenz auszukommentieren. Die beiden Arten des Kommentars können nebeneinander verwendet und auch ineinander verschachtelt verwendet werden.

Ich möchte Dich jedoch davor warnen, Kommentare zu verwenden, wenn dasselbe auch damit erreicht werden kann, sinnvolle Namen für Variablen, Konstanten und Funktionen zu finden. Durch die sinnvolle und sinngebende Auswahl von Variablen- und Funktionsnamen wird fast jeder Code selbsterklärend. Du solltest versuchen, das zu erreichen.

Die C++ Schlüsselwörter const und volatile

In den Zeilen 9 bis 11 werden zwei neue Schlüsselwörter verwendet, die nicht zum ursprünglichen Sprachumfang nach der K&R Definition gehörten, aber Teil des ANSI-C Standards sind. Das Schlüsselwort const wird verwendet, um eine Konstante zu definieren. In Zeile 9 ist diese Konstante vom Typ int, ihr Name ist START und sie wird mit dem Wert 3 initialisiert. Der Compiler wird es Dir nicht gestatten, den Wert von START absichtlich oder unabsichtlich zu ändern, weil START als Konstante deklariert wurde. Gäbe es in Deinem Programm eine Variable STARTS, wäre es Dir nicht möglich, STARTS irrtümlich als START zu schreiben und zu verändern. Der Compiler würde einen Fehler ausgeben, aufgrunddessen Du den Fehler beheben könntest. Da es nicht erlaubt ist, den Wert einer Konstanten nachträglich zu ändern, ist es unbedingt notwendig, daß die Konstante mit einem sinnvollen Wert initialisiert wird.

Du hast sicher bemerkt, daß das Schlüsselwort const auch im Funktionskopf in Zeile 23 verwendet wird, um anzuzeigen, daß der formale Parameter Wert innerhalb der Funktion eine Konstante ist. Jeder Versuch, dieser Variable einen neuen Wert zuzuweisen führt zwangsläufig zu einem Compilationsfehler. Dies ist ein kleiner Schritt, um die Fähigkeit des Compilers, für Dich Fehler zu finden, zu verbessern.

Das Schlüsselwort volatile ist Teil des ANSI-C Standards, aber in der ursprünglichen K&R Definition nicht enthalten. Der Wert einer volatile Variable kann zwar durch die Programmiererin verändert werden, die Änderung kann allerdings auch von einer anderen Quelle ausgehen, wie zum Beispiel durch einen Interrupt Zeitgeber, der den Wert der Variable hochzählt. Um den Code optimieren zu können, muß dem Compiler bekannt sein, daß die Variable durch derartige andere Einflüsse verändert werden kann. Das Studium von Codeoptimierungsverfahren ist sehr interessant, führt aber weit über den Rahmen dieser Einführung hinaus. Beachte, daß auch eine Konstante volatile sein kann, was darauf hinausläuft, daß Du die Variable nicht ändern kannst, sehr wohl aber eine Hardware-Funktion.

Einführung in C++ bringt Dich in Partnerschaft mit Amazon.de von Null auf Programmieren in ein paar Klicks.

Zum Beispiel Schlüsselwörter und mehr:

Der C++-Programmierer: C++ lernen - professionell anwenden - Lösungen nutzen
Eines der jedenfalls besseren Bücher zur Einführung in C++ ist umfassend und verständlich, übersichtlich und gelungen. Halbwegs hübsch anzuschauen ist es auch.
›› Mehr C++-Bücher

Der Ausgabebefehl in Zeile 25 soll uns im Moment noch nicht interessieren. Ihm werden wir uns später in einiger Ausführlichkeit widmen. Wenn Du einige Erfahrung mit dem K&R Standard der Programmierung hast, wirst Du Dich möglicherweise an den Zeilen 5 und 23 etwas stoßen. Hier werden die Verwendung von Prototypen und die neuere Funktionsdefinition nach dem ANSI-C Standard illustriert. Die Verwendung von Prototypen ist in C nicht verbindlich vorgeschrieben (aber empfohlen), in C++ aber absolut unumgänglich. Aus diesem Grund widmet sich Kapitel 4 ausschließlich diesem Thema.

Es ist empfehlenswert, dieses Programm jetzt mit Deinem C++ Compiler zu kompilieren und laufen zu lassen, um zu sehen, ob Du dieselben Ergebnisse erhältst wie jene, die am Ende des Programmes in den Kommentaren stehen. Einer der Hauptgründe für das Kompilieren ist, festzustellen, ob Dein Compiler richtig geladen wird und läuft.

Der Gültigkeitsbereichsoperator in C++

Beispielprogramm: GLTOP.CPP

Das Beispielprogramm GLTOP.CPP illustriert ein weiteres Element, das mit C++ neu eingeführt wird. Es gibt nichts Vergleichbares in K&R oder ANSI-C. Dieser Operator erlaubt den Zugriff auf die globale Variable mit dem Namen meinIndex, obwohl es eine lokale Variable mit demselben Namen innerhalb der Funktion main() gibt. Die Verwendung des zweifachen Doppelpunktes vor dem Variablennamen in den Zeilen 11, 13 und 16 teilt dem System mit, daß wir die globale Variable mit dem Namen meinIndex, die in Zeile 4 definiert wurde, verwenden wollen und nicht die lokale Variable, die wir in Zeile 8 definiert haben.

Diese Technik erlaubt überall im Programm den Zugriff auf globale Variablen. Sie können in Berechnungen, als Parameter einer Funktion oder für einen anderen Zweck verwendet werden. Es zeugt aber nicht von gutem Programmierstil, diese Möglichkeit des Zugriffs auf sonst versteckte Variablen zu mißbrauchen, da der Code dadurch oft schwer verständlich wird. Es ist empfehlenswert, in so einem Fall einen anderen Variablennamen zu wählen, aber die Möglichkeit existiert für den Fall, daß Du sie einmal benötigen solltest.

Bevor Du zum nächsten Beispiel weitergehst solltest Du dieses Programm kompilieren und laufen lassen. Unser nächstes Beispielprogramm widmet sich dem cout Operator in den Zeilen 10, 11, 15 und 16.

Die iostream Bibliothek in C++

Beispielprogramm: NACHR.CPP

Wirf einen Blick auf das Beispielprogramm NACHR.CPP als einem ersten Beispiel objektorientierten Programmierens, einem sehr einfachen allerdings. In diesem Programm definieren wir einige Variablen und weisen ihnen Werte zu. In den Ausgaberoutinen in den Zeilen 17 bis 20 und 23 bis 26 finden diese Variablen dann Verwendung. cout wird verwendet, um Daten mittels der Standardausgabe (üblicherweise der Bildschirm) auszugeben, aber es bestehen gewisse Unterschiede zur altbekannten printf() Funktion, da wir dem System nicht mitteilen müssen, welchen Typs die auszugebenden Daten sind. Beachte bitte, daß cout nicht direkt eine Ausgabefunktion ist. Wir können es aber als solche betrachten, bis wir das später in dieser Einführung genauer definieren. Bis dahin soll es uns genügen, festzuhalten, daß cout ein Objekt ist, das wir zur Ausgabe von Daten auf dem Bildschirm verwenden.

In C++ sind wie auch in C keine Ausgabefunktionen als Bestandteil der Sprache selbst enthalten, sondern es wird die stream Bibliothek definiert, um auf elegante Weise Ein- und Ausgabefunktionen hinzuzufügen. Die stream Bibliothek wird in Zeile 2 in unser Programm eingebunden.

Der Operator << bewirkt, daß die Variable oder Konstante, die direkt auf den Operator folgt, ausgegeben wird, überläßt es aber dem System zu entscheiden, wie dies geschehen soll. In Zeile 17 weisen wir das System zuerst an, die Zeichenkette auszugeben. Dies passiert, indem die einzelnen Buchstaben auf den Bildschirm kopiert werden. Danach soll das System den Wert von meinIndex ausgeben. Beachte aber, daß wir dem System keinerlei Angaben darüber machen, welchen Typs meinIndex ist oder wie der Wert ausgegeben werden soll. Daher liegt es am System, festzustellen, was für eine Variable bzw. Konstante meinIndex ist und den Wert dementsprechend auszugeben. Nachdem das System den Typ herausgefunden hat, überlassen wir es ihm auch, den Standardwert dafür zu verwenden, wieviele Zeichen ausgegeben werden sollen. In diesem Fall wählt das System genau so viele Zeichen wie für die Ausgabe notwendig sind ohne etwaige voran- oder nachgestellte Leerzeichen, also genau, was wir für diese Ausgabe wollen. Schlußendlich wird noch der Zeilensprung als eine Zeichenkette mit nur einem Zeichen ausgegeben, und die Zeile mit einem Strichpunkt abgeschlossen.

Beim Aufruf der cout Ausgabefunktion in Zeile 17 haben wir eigentlich zwei verschiedene Funktionen aufgerufen, da wir sie sowohl für die zwei Zeichenketten als auch für die Variable vom Typ int verwendet haben. Dies ist der erste Hinweis auf objektorientiertes Programmieren, wir fordern vom System einfach, einen Wert auszugeben und überlassen dem System die Suche nach der passenden Funktion. Es ist nicht notwendig, dem System genau mitzuteilen, wie die Daten auszugeben sind, sondern nur, daß sie auszugeben sind. Das ist ein schwaches Beispiel für objektorientiertes Programmieren und wir werden das an anderer Stelle in dieser Einführung mit wesentlich mehr Tiefgang behandeln.

Einführung in C++ bringt Dich in Partnerschaft mit Amazon.de von Null auf Programmieren in ein paar Klicks.

Zum Beispiel Bibliotheken und mehr:

Der C++-Programmierer: C++ lernen - professionell anwenden - Lösungen nutzen
Eines der jedenfalls besseren Bücher zur Einführung in C++ ist umfassend und verständlich, übersichtlich und gelungen. Halbwegs hübsch anzuschauen ist es auch.
›› Mehr C++-Bücher

In Zeile 18 lassen wir das System eine andere Zeichenkette ausgeben, gefolgt von einer Fließkommazahl und einer weiteren Zeichenkette, die aus einem Zeichen besteht, nämlich dem Zeilenvorschub. In diesem Fall haben wir das System angewiesen, eine Fließkommazahl auszugeben ohne zusätzliche Angaben über den Variablentyp zu machen und lassen das System wiederum über die richtige Ausgabefunktion, die sich am Variablentyp orientiert, entscheiden. Mit diesem Prozeß haben wir ein wenig an Kontrolle verloren, da wir nicht entscheiden konnten, wie viele Zeichen vor oder nach dem Komma auszugeben sind. Wir haben uns dafür entschieden, das System entscheiden zu lassen, wie die Ausgabe erfolgen soll.

Die Variable mit dem Namen Buchstabe hat den Variablentyp char und ihr wird in Zeile 14 der Wert X zugewiesen. In Zeile 19 wird sie dann als Buchstabe ausgegeben, da das cout Objekt weiß, daß es sich um einen Buchstaben handelt und die Variable entsprechend ausgibt.

Da C++ weitere Operatoren und Funktionen für Zeichenketten bereithält, sind die Ausgabefunktionen für Zeichenketten sehr flexibel. Bitte schlag in der Dokumentation Deines Compilers die Details weiterer Formatierungsmöglichkeiten nach. Die cout und printf() Funktionen können nebeneinander verwendet werden, was höchstwahrscheinlich auch Teil des ANSI-C++ Standard sein wird. Allerdings halten sich noch nicht alle Compiler an diesen Standard und manche verwenden verschiedene Formen der Zwischenspeicherung für diese zwei Möglichkeiten der Ausgabe. Das führt unter Umständen zu "wirren" Ausgaben, aber Du kannst dies einfach dadurch korrigieren, daß Du Dich für eine der beiden Formen, entweder cout oder printf() entscheidest.

Mehr über die C++ stream Bibliothek

Die stream Bibliothek wurde für die Verwendung mit C++ definiert, um die Effizienz der Sprache zu steigern. Die printf() Funktion wurde schon früh in der Geschichte von C entwickelt und soll alle Möglichkeiten für alle Programmiererinnen bieten. So wurde sie eine umfangreiche Funktion mit viel zusätzlichem Ballast, der zum größten Teil nur von sehr wenigen Programmiererinnen genutzt wird. Die Definition der schlanken stream Bibliothek erlaubt es der Programmiererin, auf alle Möglichkeiten der Formatierung zuzugreifen, aber nur das zu laden, was gerade benötigt wird. Wir gehen hier zwar nicht auf alle Einzelheiten ein, die C++ stream Bibliothek bietet aber eine große Bandbreite an Formatierungsfunktionen. In der Dokumentation zu Deinem Compiler sollte sich eine komplette Liste aller Möglichkeiten finden.

In den Zeilen 23 bis 26 werden einige der zusätzlichen Funktionen der stream Bibliothek illustriert, die Du verwenden kannst, um Daten sehr flexibel und doch kontrolliert darzustellen. Der Wert von index wird in den Zeilen 23 bis 25 in dezimaler, oktaler und hexadezimaler Notation ausgegeben. Sobald einer der speziellen Operatoren für Zeichenketten, dec, oct oder hex ausgegeben wird, erfolgt jede weitere Ausgabe in dieser Notation. So wird zum Beispiel in Zeile 30 der Wert von index in hexadezimaler Notation ausgegeben, da in Zeile 25 diese Form gewählt wurde. Wird keiner der speziellen Operatoren ausgegeben, ist das Standardformat dezimal.

Der cin Operator in C++

Neben dem durch die Bibliothek vordefinierten Datenstrom cout gibt es cin, welcher zum Einlesen von Daten über das Standardeingabegerät (im Regelfall die Tastatur) verwendet wird. Der cin stream verwendet den Operator >>. Ein Großteil der Flexibilität des Datenstromes cout findet sich bei cin wieder. Ein kurzes Beispiel für die Anwendung von cin siehst Du in den Zeilen 28 bis 30. Die speziellen Operatoren für Datenströme, dec, oct und hex legen gleichfalls die Notation für cin fest, unabhängig von cout. Der Standardwert ist wieder dezimal.

Zusätzlich zu den Datenstromobjekten cout und cin gibt es noch einen Standarddatenstrom, cerr. Über cerr werden standardmäßig Fehler ausgegeben. Diese Ausgabe kann im Gegensatz zu cout nicht in eine Datei umgeleitet werden. Die drei Datenstromobjekte, cout, cin und cerr entsprechen den Zeigern auf Datenströme stdout, stdin und stderr in C. Beispiele für ihre Verwendung werden uns durch die gesamte Einführung begleiten.

Die stream Bibliothek beinhaltet auch Ein- und Ausgabe in und von Dateien. Dies werden wir kurz im nächsten Beispiel vorstellen.

Kompiliere dieses Programm und führe es aus bevor Du zum nächsten weitergehst. Denke daran, daß das System die Eingabe einer ganzen Zahl verlangt, die wieder am Bildschirm ausgegeben wird, allerding in hexadezimaler Notation.

Ein- und Ausgabe mit Dateien

Beispielprogramm: DSTROM.CPP

Das Programm DSTROM.CPP ist ein Beispiel für die Verwendung von Datenströmen mit Dateien. Wir werden in diesem Programm einige C++ Objekte verwenden, die wir noch nicht kennen, Du wirst sie also jetzt noch nicht vollkommen verstehen.

In diesem Programm öffnen wir eine Datei zum Lesen, eine andere zum Schreiben und ein dritter Datenstrom wird zu einem Drucker geöffnet, um das Hantieren mit Dateien zu demonstrieren. In C haben Dateien sowohl zur Eingabe als auch zur Ausgabe den Typ FILE, allerdings wird ifstream für Einlesen aus Dateien verwendet, ofstream zum Schreiben. Das wird in den Zeilen 7 bis 9 dieses Beispielprogrammes demonstriert. Eigentlich ist ifstream eine C++ Klasse und EingDatei ein Objekt dieser Klasse, wie wir später sehen werden.

Der einzige Unterschied zwischen den Datenströmen des letzten Programmes und jenen dieses Beispielprogrammes besteht darin, daß die Datenströme im vorigen Programm schon vom System für uns geöffnet wurden. Du wirst sicherlich bemerken, daß der Datenstrom Drucker genau in derselben Weise verwendet wird wie cout im letzten Programm. Natürlich schließen wir alle Dateien, die wir geöffnet haben, wieder. Schließlich wollen wir guten Programmierstil praktizieren.

In diesem Programm verwenden wir Objekte, also ist es das erste Beispiel für objektorientiertes Programmieren. Das Objekt mit dem Namen EingDatei weisen wir in Zeile 16 an, sich selbst zu öffnen. In Zeile 40 soll es dann ein Zeichen nach dem anderen einlesen, in Zeile 47 steht die Anweisung, sich selbst wieder zu schließen. Die "Punkt"-Notation wird für Objekte ähnlich verwendet wie für Strukturen in C. Man gibt den Namen des Objektes an, gefolgt von einem "Punkt" und schließlich von der Aktion, die das Objekt ausführen soll. Mit den Objekten AusgDatei und Drucker wird in genau derselben Weise verfahren.

Einführung in C++ bringt Dich in Partnerschaft mit Amazon.de von Null auf Programmieren in ein paar Klicks.

Zum Beispiel Dateien und mehr:

C++. Der Einstieg
Ein bewährtes Buch auf halben Wegs aktuellem Stand: Arnold Willemers "C++. Der Einstieg" eignet sich tatsächlich zum Einstieg ins Programmieren mit C++ und erklärt klar strukturiert mit, ganz wichtig, allerhand Beispielen alles Wichtige.
›› Mehr C++-Bücher

Bjarne Stroustrups Buch bietet mehr und tiefergreifende Informationen über die stream Bibliothek, ebenso wie die Dokumentation zu Deinem Compiler. Mach Dir aber jetzt noch nicht zu viele Gedanken darüber. Wenn Du nämlich die Terminologie der Sprache C++ im Laufe dieser Einführung einemal gelernt hast, kannst Du Dich einem eingehenderen Studium der stream Bibliothek widmen, von dem Du dann sicherlich sehr profitierst.

Kompiliere dieses Programm und führe es aus. Es wird eine Datei verlangen, die es kopieren soll. Du kannst den Namen jeder ASCII Datei angeben, die sich in demselben Verzeichnis befindet wie das Programm.

Variablendefinition in C++

Beispielprogramm: VARDEF.CPP

Das Beispielprogramm VARDEF.CPP ist ein Beispiel für einige weitere Neuerungen von C++, die helfen, klare und einfach zu verstehende Programme zu schreiben. In C++ werden globale und statische Variablen ebenso wie in ANSI-C automatisch mit 0 initialisiert. Die Variablen meinIndex in Zeile 4 und Goofy in Zeile 26 werden also automatisch mit 0 initialisiert. Natürlich kannst Du beide mit irgendeinem anderen Wert initialisieren, wenn Du willst.

Variablen, die innerhalb einer Funktion deklariert werden, werden nicht automatisch mit 0 initialisiert, sondern nehmen den Wert an, der sich gerade an dem Ort im Speicher befindet, wo die Variable definiert wird. Dieser Wert ist nichts wert. Demnach hat die Variable Etwas in Zeile 8 keinen gültigen, sondern irgendeinen Wert, der nicht für etwas Sinnvolles verwendet werden sollte (bzw. kann?). In Zeile 11 wird ihr ein Wert gemäß dem initialisierten Wert von meinIndex zugewiesen. Dieser Wert wird zur Kontrolle am Bildschirm ausgegeben.

Die C++ Referenz

Bitte beachte das "&" in Zeile 9. Es definiert EtwasAnderes als Referenz, eine Neuerung von C++. In diesem Zusammenhang sollte eine Referenz allerdings nur sehr selten, wenn überhaupt, verwendet werden. Das ist ein sehr einfaches Beispiel für eine Referenz und soll ihre Verwendung verdeutlichen.

Es gibt nichts Vergleichbares in C, da

Nach ihrer Initialisierung wird die Referenz zu einem Synonym für die Variable Etwas. Eine Änderung des Wertes von Etwas ändert notwendigerweise auch den Wert von EtwasAnderes, da beide sich auf dieselbe Variable beziehen. Das Synonym kann im Rahmen der C++ Programmiersprache verwendet werden, um auf den Wert der Variablen zuzugreifen. Eine Referenz muß zum Zeitpunkt der Deklaration auf eine Variable initialisiert werden oder der Compiler gibt eine Fehlermeldung aus. Auf welche Variable eine Referenz verweist kann später im Programm nicht mehr geändert werden. Die Referenz ist etwas schwierig zu behandeln, da wir sie Referenzvariable nennen wollen, sie aber keine Variable ist, da sie ja nicht geändert werden kann. Ob uns der Name nun gefällt oder nicht, die Referenz heißt einfach so.

Wird eine Referenz so verwendet wie in diesem Beispiel, kann dies zu sehr unübersichtlichem und verwirrendem Code führen, aber sie kann — anders verwendet — den Code auch sehr klar und einfach machen. Wir werden uns der richtigen Verwendung von Referenzen in Kapitel 4 dieser Einführung widmen.

Definitionen sind ausführbar

Mit einem Grundwissen in C wird Dir Zeile 16 sehr eigenartig anmuten, sie ist aber in C++ erlaubt. Wo immer eine ausführbare Anweisung erlaubt ist, ist es auch erlaubt, eine neue Variable zu deklarieren, da die Deklaration in C++ als ausführbare Anweisung deklariert ist. Im vorliegenden Fall definieren wir die neue Variable WiederAnderes und initialisieren sie mit dem Wert 13. Die Lebensdauer dieser Variable erstreckt sich vom Punkt ihrer Definition bis zum Ende des Blocks in dem sie definiert wurde, im Falle von WiederAnderes also bis zum Ende des Programmes main(). Die Variable Goofy wird noch später in Zeile 27 definiert.

Es ist wesentlich, eine Variable nahe dem Punkt ihrer Verwendung zu deklarieren. Damit kann man einfach ersehen, wofür eine Variable genutzt wird, da der Bereich, wo sie verwendet werden kann, wesentlich enger eingeschränkt ist. Bei der Fehlersuche ist es sehr hilfreich, wenn die Deklaration der Variablen und der zu überprüfende Code nahe beieinander liegen.

Definition und Deklaration

Definition und Deklaration sind zwei verschiedene Dinge in C++, wie übrigens auch in ANSI-C. Wir wollen nun eindeutig festlegen, was diese beiden Begriffe in C++ bedeuten. Eine Deklaration informiert den Compiler über die Eigenschaften etwa von einem Typen oder einer Funktion, definiert aber keinen Code, der im ausführbaren Programm verwendet wird. Eine Definition andererseits, definiert etwas, das im ausführbaren Programm tatsächlich existiert, etwa eine Variable oder Code-Zeilen. Jede Einheit im Programm muß genau eine Definition haben. Kurz, eine Deklaration führt einen Namen im Programm ein und eine Definition Code und dieser braucht Platz im Speicher.

Wenn wir ein struct deklarieren, deklarieren wir im Grunde nur ein Muster, nach dem der Compiler später im Programm, wenn wir dann Variablen dieses Typs deklarieren, diese speichern soll. Definieren wir aber Variablen dieses Typs, deklarieren wir die Namen dieser Variablen und definieren einen Platz im Speicher für ihre Werte. Deshalb führen wir beim Definieren einer Variablen eigentlich zwei Vorgänge aus: wir deklarieren sie und definieren sie gleichzeitig.

In C sind mehrere Definitionen einer Variable erlaubt, solange die Definition dieselben sind und es sich um ein und dieselbe Variable handelt. C++ verbietet eine solche Vorgangsweise aus einem guten Grund, wie wir später sehen werden.

Wir werden uns im Laufe dieser Einführung noch sehr oft auf diese Definitionen beziehen und auf sie eingehen, sollte also jetzt noch etwas unklar sein, wird das später klarer werden.

Eine bessere for-Schleife in C++

Schau Dir die for-Schleife, die wir in Zeile 20 definieren, genau an. Diese Form der for-Schleife ist etwas klarer als jene von ANSI-C, da der Schleifenindex erst in der for-Schleife selbst definiert wird. Die Lebensspanne des Index hängt davon ab, wie neu (oder alt) Dein Compiler ist.

Hast Du einen etwas älteren Compiler, reicht die Lebensspanne des Index von der Definition bis zum Ende des umschließenden Blocks. In diesem Fall reicht sie dann bis Zeile 32, da die schließende geschwungene Klammer in Zeile 32 zu der letzten geöffneten geschwungenen Klammer vor der Definition der Variablen gehört. Da die Variable noch verfügbar ist, kann sie für eine weiter Schleife oder jeden anderen Zweck, für den eine Variable vom Typ int eingesetzt werden kann, verwendet werden.

Ist Dein Compiler aber relativ neu, endet die Lebensspanne des Index mit dem Ende der Schleife. In diesem Fall reicht sie also bis Zeile 25, wo die Schleife endet. Dies wurde erst vor kurzem vom Komitee, das die Standards festsetzt, eingeführt und ist nur bei den neuesten Compilern umgesetzt.

Egal wie alt Dein Compiler ist, die Variable mit dem Name Zaehler2 wird bei jedem Schleifendurchlauf definiert und initialisiert, da sie innerhalb des von der for-Schleife kontrollierten Blocks definiert wird. Ihre Lebensspanne erstreckt sich nur auf diese Schleife, das heißt die Zeilen 23 bis 25, sodaß der von ihr eingenommene Speicherplatz bei jedem Schleifendurchlauf automatisch freigegeben wird.

Einführung in C++ bringt Dich in Partnerschaft mit Amazon.de von Null auf Programmieren in ein paar Klicks.

Zum Beispiel saubere Schleifen:

Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe
Auch, wenn man nicht alles hier gut findet, macht Martins "Clean Code" einen unvermittelt (und unverhinderbar) zur besseren Programmiererin. Viele, viele Beispiele, ergo sehr, sehr lehrreich.
›› Mehr Softwareentwicklung-Bücher

Dir wird aufgefallen sein, daß der Variablen Zaehler2 in Zeile 23 eine Zahl zugewiesen wird, bei der Ausgabe aber ein Buchstabe ausgegeben wird. Dies ist der Fall, weil C++ sehr bedacht darauf ist, den richtigen Ausgabetypen zu verwenden. Hast Du einen sehr alten Compiler, gibt er hier möglicherweise eine Zahl aus.

Schließlich wird in Zeile 27 die statische Variable Goofy definiert und automatisch mit 0 initialisiert, wie wir schon zuvor bemerkt haben. Ihre Lebensspanne reicht vom Punkt der Definition bis zum Ende des Blockes, in dem die Initialisierung geschieht, in diesem Fall Zeile 32.

Kompiliere das Programm und führe es aus.

Die Priorität der Operatoren in C++

Die Priorität der Operatoren ist identisch mit jener in ANSI-C, wir werden sie hier also nicht definieren. Es gibt einen kleinen Unterschied bei einigen Operatoren, wenn sie überladen werden, eine Technik, die wir später in dieser Einführung erlernen werden. Einige Operatoren funktionieren ein wenig anders, wenn sie überladen werden.

Mach Dir keine Gedanken über den vorigen Absatz, all das wird klarer werden, wenn wir uns einigen weiteren Punkten gewidmet haben.

Programmieraufgaben

  1. Schreibe ein Programm, das Deinen Namen und Dein Geburtsdatum mit Hilfe des Datenstromobjektes cout drei Mal am Bildschirm ausgibt. Definiere alle Variablen, die Du verwendest möglichst nahe ihrer Verwendung.
  2. Schreibe ein Programm mit einigen konstanten (const) Werten und von außen veränderbaren (volatile) Variablen und versuche, den Wert der Konstanten zu verändern, um zu sehen, welche Fehlermeldung Dein Compiler ausgibt.
  3. Schreibe ein Programm, das Datenstromobjekte verwendet, um Dein Geburtsdatum mit drei verschiedenen cin Anweisungen entgegenzunehmen. Gib Dein Geburtsdatum in oktaler, dezimaler und hexadezimaler Notation aus.

(weiter »)

Einführung in C++ bringt Dich in Partnerschaft mit Amazon.de von Null auf Programmieren in ein paar Klicks.

Zum Beispiel zum leichten Anfgang:

Schrödinger programmiert C++: Jetzt mit C++14 und Syntaxhighlighting
Das beste Programmierlernbuch — egal in welcher Sprache? Kann gut sein. Statt trocken ist Dieter Bärs Meisterstück lehrreich, statt mühsam beispielhaft beispielbehaftet, statt Nachschlagewerk (das ist es wirklich nicht) Nur-noch-ein-Bissi-Weitermachbuch und statt unverständlich sinnvoll das Verstehen (statt dem Memorisiern) fördernd erklärend.
›› Mehr C++-Bücher

[ allgemeine ]