C++-Programmierung/ Weitere Grundelemente/ Zusammenfassung: Unterschied zwischen den Versionen
(kein Unterschied)
|
Aktuelle Version vom 8. Juli 2019, 14:17 Uhr
C++-Programmierung/ Vorlage:Navigation
Funktionen
Deklaration
Eine Funktion kann in C++ beliebig oft (übereinstimmend) deklariert werden. Zur Deklaration gehören der Funktionsname, der Rückgabetyp und die Parametertypen. Es ist gestattet den Parametern in der Deklaration Namen zu geben, diese werden vom Compiler jedoch vollständig ignoriert, sie dienen ausschließlich als Information für den Programmierer.
C++-Programmierung/ Vorlage:Syntax
Soll eine Funktion keinen Wert zurückgeben, lautet der Rückgabetyp formal Vorlage:Cpp.
Definition
Eine Definition ist immer auch eine Deklaration. Eine Definition darf nur einmal im gesamten Programm gemacht werden. Später wird mit dem Schlüsselwort Vorlage:Cpp die einzige Ausnahme von dieser Regel eingeführt, solche Funktionen dürfen mehrfach übereinstimmend definiert werden.
C++-Programmierung/ Vorlage:Syntax
Aufruf
C++-Programmierung/ Vorlage:Syntax
Beachten Sie für parameterlose Funktionen unbedingt, dass ein Weglassen der Klammern die Funktionsadresse liefert anstatt die Funktion aufruft.
C++-Programmierung/ Vorlage:Code
C++ erlaubt Rekursion, wobei die Rekursionstiefe typischerweise vom Compiler beschränkt wird.
Überladen
Es ist möglich mehrere Funktionen mit gleichem Namen aber unterschiedlicher Parameterliste (hinsichtlich der Länge und/oder der Typen) zu definieren. Der Compiler ermittelt dann beim Aufruf der Funktion aus dem Namen und den übergebenen Parametern welche Funktion konkret gemeint ist. Dies bezeichnet man als Überladung einer Funktion.
Standardparameter
Für jeden Parameter einer Funktion kann in der Funktionsdeklaration ein Standardwert angegeben werden. Jeder Parameter rechts von einem Parameter mit Standardwert muss ebenfalls einen Standardwert besitzen. Standardparameter dürfen nur in genau einer Deklaration angegeben werden.
Beliebige Parameteranzahl
In C verwendete man gelegentlich Funktionen für die als letzter Parameter Vorlage:Cpp angegeben war. Solchen Funktionen kann man beliebig viele Parameter übergeben. Nach dem Einbinden der Headerdatei Vorlage:Cpp kann innerhalb der Funktion mit Hilfe der Vorlage:Cpp-Makros auf die übergebenen Parameter zugegriffen werden. Diese Technik ist typunsicher und veraltet, sie wird mit dem kommenden C++ Standard (derzeit als C++11 bekannt) überflüssig, da dieser variable Parameterlisten mittels „variadic templates“ erlaubt.
Aufzählungen
Enumerationen werden mit Vorlage:Cpp eingeleitet und definieren einen Typ, der mehrere ganzzahlige Konstanten (Enumeratoren) enthält. Die Werte der Konstanten können explizit vergeben werden. Ist kein Wert angegeben zählt der Compiler von der letzten vergebenen Konstante aus hoch, im Falle der ersten Konstante nimmt der Compiler 0 als Wert. Negative Werte sind zulässig. Der Wertebereich einer Enumeration ist so festgelegt, dass die kleinste mögliche Zweierpotenz größer dem größten vergebene Wert ist. Falls negative Indizes vergeben wurden, reichen die Werte von , andernfalls ist er . Enumeratoren können implizit in Ganzzahlen umgewandelt werden. Ganzzahlen können explizit in einen Wert vom Typ einer Enumeration umgewandelt werden. Liegt der Ganzzahlwert hierbei außerhalb des Wertebereichs der Enumeration ist das Verhalten undefiniert!
C++-Programmierung/ Vorlage:Syntax
Zeiger
Zeiger werden mit einem Stern Vorlage:Cpp im Typ angegeben, wobei der Typ, auf den der Zeiger zeigt, immer links vom Stern steht. Bei der gleichzeitigen Deklaration mehrerer Variablen muss der Stern vor jedem Variablennamen angegeben werden, der ein Zeiger sein soll. Gleichzeitige Deklaration mehrerer Variablen sollte jedoch aus Gründen der Übersicht allgemein vermieden werden.
C++-Programmierung/ Vorlage:Syntax
Auf die Daten, auf die der Zeiger zeigt, wird mit Hilfe des Dereferenzierungsoperators Vorlage:Cpp zugegriffen. Die Adresse einer Funktion wird über den Adressoperator Vorlage:Cpp ermittelt. Beide Operatoren müssen links von ihrem Operanden stehen.
C++-Programmierung/ Vorlage:Syntax
Schlüsselwort Vorlage:Cpp
Das Schlüsselwort Vorlage:Cpp kann für Zeiger sowohl auf den dereferenzierten Wert angewendet werden, als auch auf die Zeigervariable selbst. Vorlage:Cpp bezieht sich wie immer auf das, was direkt links davon steht.
Zeigerarithmetik
Für Zeiger sind die Addition und die Subtraktion definiert. Die Größe des Datentyps auf den gezeigt wird entscheidet über die Schrittweite. Wird also zu einem Zeiger auf Vorlage:Cpp 5 addiert, so erhöht sich die Adresse um Vorlage:Cpp Byte.
Zeiger auf Vorlage:Cpp
Zeiger auf Vorlage:Cpp gelten allgemein als veraltet (C), werden aber in begründeten Einzelfällen noch eingesetzt. Ihre Schrittweite in der Zeigerarithmetik beträgt 1 Byte und sie lassen sich implizit aus allen Zeigertypen und in alle Zeigertypen umwandeln. Es ist nicht möglich einen Vorlage:Cpp-Zeiger zu dereferenzieren.
Funktionszeiger
Die Adresse einer Funktion lässt sich über den Funktionsnamen ermitteln, optional kann diesem auch noch der Adressoperator (Vorlage:Cpp) vorangestellt werden (empfohlen). Ein Funktionszeiger wird äquivalent zum Prototypen des gewünschten Funktionstypes definiert, wobei an Stelle des Funktionsnamens der Variablenname in runden Klammern und hinter einem Stern angegeben wird.
Referenzen
Referenzen sind Aliasnamen für andere Variablen. Sie müssen als solche immer mit einer anderen Variable initialisiert werden. Ihre Deklaration erfolgt durch ein Vorlage:Cpp rechts vom Typ, äquivalent zum Vorlage:Cpp bei Zeigern. Es ist nicht möglich und auch nicht sinnvoll Referenzen auf Referenzen zu deklarieren. Intern sind Referenzen meist über Zeiger realisiert.
Felder
Felder oder Arrays sind mehrere Variablen des gleichen Typs, die direkt hintereinander im Speicher stehen. Folglich lassen sich die einzelnen Elemente mithilfe der Zeigerarithmetik ansprechen, es gibt jedoch auch einen Indexoperator, welcher einen intuitiven Zugriff erlaubt. Die Syntax für Felder lautet:
C++-Programmierung/ Vorlage:Syntax
Zeiger und Felder
Analog zu Funktionen ist der Zugriff auf die Adresse des Arrays über den Variablennamen möglich, wobei die Adresse der Adresse des ersten Array-Elements entspricht. Entsprechend ist es nicht möglich, Arrays an Funktionen zu übergeben, stattdessen kann nur die Array-Adresse übergeben werden. Der Compiler hat innerhalb der Funktion aber nicht mehr die Möglichkeit, zwischen einem Zeiger auf eine gewöhnliche Variable und einer Array-Variable zu unterscheiden. Der Indexoperator ist eine alternative Schreibweise für die Zeiger-Arithmetik, er funktioniert somit für alle Adressen.
Mehrdimensionale Felder
Mehrdimensionale Arrays werden als Arrays von Arrays deklariert und benutzt.
Zeichenketten
Strings sind in C++ kein Basisdatentyp sondern eine Klasse aus der Standardbibliothek. Die Klasse kapselt die aus C stammenden nullterminierten Strings, welche kaum intuitiv zu benutzen waren. Klassen bestehen aus Variablen und Methoden, wobei Methoden nur ein Wort für Funktionen in Klassen ist. Methoden werden aufgerufen, indem der Variablenname ihrer Stringvariable gefolgt von einem Punkt und dem Methodenaufruf (= Funktionsaufruf) geschrieben wird. Außerdem sind einige nützliche Operatoren für die Stringklasse überladen. Im folgenden werden die wichtigsten Methoden und Operatoren kurz vorgestellt. Um Strings benutzen zu können müssen Sie die Headerdatei Vorlage:Cpp einbinden. Der Datentyp (= Klassenname) heißt Vorlage:Cpp, wobei das Vorlage:Cpp natürlich der Standardnamensraum ist.
C-Strings sind übrigens Vorlage:Cpp-Arrays, wobei das Stringende durch ein Nullzeichen ('\0') definiert wird. Ein Array aus N Vorlage:Cpp-Elementen kann also N-1 Zeichen speichern. Um Strings auf einfache Weise im Programmcode schreiben zu können, wurde in C ein Literal für derartige Vorlage:Cpp-Arrays eingeführt. Der eigentliche String wird dabei in doppelte Anführungszeichen gesetzt. Diese Literale werden in C++ natürlich auch noch verwendet, jedoch werden sie hier eben an Vorlage:Cpp-Variablen übergeben, daher ist es nicht mehr nötig direkt mit den Arrays zu arbeiten.
Ein-/Ausgabe
Die Ein-/Ausgabe von Strings funktioniert genau wie bei den Basisdatentypen. Bei der Eingabe ist zu beachten, dass der Eingabeoperator (wie bei den Basisdatentypen) Leerraumzeichen überliest und anschließend alle Zeichen bis zum nächsten Leerraumzeichen einliest. Entsprechend ist es auf diese Weise nicht möglich einen String einzulesen, der Leerzeichen enthält. Hierfür gibt es die Funktion Vorlage:Cpp, die bis zum nächsten Newline-Zeichen einliest.
C++-Programmierung/ Vorlage:Syntax
Zuweisen
Es ist möglich Stringliterale und andere Stringvariablen per Zuweisungsoperator (Vorlage:Cpp) in eine Stringvariable zu schreiben.
Verketten
Strings lassen sich mithilfe des Plusoperator Vorlage:Cpp verketten, jedoch beachten Sie, dass mindestens ein Operand vom Typ Vorlage:Cpp sein muss. Die Verkettung zweier Stringliterale ist somit nicht möglich, für gewöhnlich aber auch nicht nötig. Natürlich ist auch der Vorlage:Cpp-Operator für das Hinzufügen eines Strings zu einem anderen definiert.
Zeichenzugriff
Mithilfe des Zugriffsoperators (Vorlage:Cpp) ist, analog zu Arrays, der Zugriff auf die einzelnen Zeichen des Strings möglich. Die Anzahl der aktuell enthaltenen Zeichen liefern die Methoden Vorlage:Cpp und Vorlage:Cpp. Welche Funktion Sie verwenden ist reine Geschmackssache. Vorlage:Cpp drückt gut aus, was abgefragt wird, Vorlage:Cpp ist dafür in allen Containerklassen definiert.
Vergleiche
Die sechs Vergleichsoperatoren sind für Strings definiert, wobei auch hier mindestens ein Operand vom Typ Vorlage:Cpp sein muss. Der Vergleich wird elementweise auf Basis der Zeichen ausgeführt.
Suchen, Ersetzen, Einfügen, Kopieren, Löschen
Die folgende nützliche Methoden sind in der Stringklasse enthalten:
- Vorlage:Cpp sucht nach Vorlage:Cpp ab der Position Vorlage:Cpp.
- Vorlage:Cpp ersetzt den Text zwischen (inklusive) Vorlage:Cpp bis (exklusive) Vorlage:Cpp durch Vorlage:Cpp.
- Vorlage:Cpp fügt den String Vorlage:Cpp vor der Position Vorlage:Cpp ein.
- Vorlage:Cpp extrahiert ab der Position Vorlage:Cpp Vorlage:Cpp Zeichen und gibt diese als neuen String zurück.
- Vorlage:Cpp löscht ab der Position Vorlage:Cpp Vorlage:Cpp Zeichen.
Umwandlung: Zahl – String
Definieren Sie zuerst zwei Templates. Wie Templates funktionieren erfahren Sie in einem späteren Kapitel.
C++-Programmierung/ Vorlage:Code
Präprozessor
Der Präprozessor läuft vor dem Compiler und verarbeitet alle Zeilen die mit einem Doppelkreuz (Vorlage:Cpp) beginnen. Ein solcher Befehl kann auf mehrere Zeilen ausgedehnt werden, indem das Zeilenende mit einem vorangestellten Backslash (Vorlage:Cpp) maskiert wird.
- Vorlage:Cpp fügt die angegebene Datei an dieser Stelle ein. Wird die Datei in spitzen Klammern angegeben, so wird in den Standardpfaden der Umgebung nach ihr gesucht. Wird die Datei in doppelten Anführungszeichen angegeben, so wird zusätzlich zunächst im aktuellen Verzeichnis gesucht.
- Vorlage:Cpp definiert eine Präprozessorvariable bzw. ein Makro.
- Vorlage:Cpp löscht eine definierte Präprozessorvariable bzw. ein Makro.
- Vorlage:Cpp führt eine Compilerspezifische Anweisung aus, kennt der Compiler die Anweisung nicht werden solche Zeilen ignoriert.
- Vorlage:Cpp, Vorlage:Cpp, Vorlage:Cpp, Vorlage:Cpp, Vorlage:Cpp und Vorlage:Cpp erlauben bedingten Code. Dies wird insbesondere zum Schutz vor Mehrfachinkludierung von Headerdateien verwendet.
- Vorlage:Cpp bzw. Vorlage:Cpp lassen den Compiler einen Fehler bzw. eine Warnung ausgeben.
Vordefinierte Präprozessor-Variablen
- Vorlage:Cpp: Zeilennummer
- Vorlage:Cpp: Dateiname
- Vorlage:Cpp: Datum des Präprozessoraufrufs im Format Monat/Tag/Jahr
- Vorlage:Cpp: Zeit des Präprozessoraufrufs im Format Stunden:Minuten:Sekunden
- Vorlage:Cpp: Ist nur definiert, wenn ein C++-Programm verarbeitet wird
Headerdateien
Deklarationen werden üblicherweise in Headerdateien ausgelagert, welche dann mittels Vorlage:Cpp eingebunden werden. Auf diese Weise können mehrere Quelldateien die gleichen Deklarationen nutzen, während die Definition vom Compiler nur in einer Objektdatei erzeugt wird.