Die Programmiersprache C++ Inhaltsverzeichnis Die Programmiersprache C++ .............................................................................................................. 1 1 2 3 4 5 6 7 8 Einführung ..................................................................................................................................... 4 1.1 Syntax..................................................................................................................................... 4 1.2 Präcompiler ............................................................................................................................ 4 Variablen, Makros und Konstanten............................................................................................. 6 2.1 Tipps zu den Variablen........................................................................................................... 6 2.2 Makros.................................................................................................................................... 6 2.3 Konstanten ............................................................................................................................. 7 2.4 Präfix ...................................................................................................................................... 7 Datentypen..................................................................................................................................... 9 3.1 der Boolesche Typ ................................................................................................................. 9 3.2 Zeichentypen .......................................................................................................................... 9 3.3 Ganzzahltypen ....................................................................................................................... 9 3.4 Gleitkommatypen ................................................................................................................... 9 3.5 Eigene Datentypen................................................................................................................. 9 3.6 Nicht typisierte Werte – void................................................................................................. 10 3.7 Casting / Typumwandlung.................................................................................................... 10 3.8 Übersicht .............................................................................................................................. 10 3.9 Ratschläge ........................................................................................................................... 11 Zeiger, Felder und Strukturen.................................................................................................... 12 4.1 Arrays / Felder ...................................................................................................................... 12 4.2 Pointer / Zeiger / Adressen................................................................................................... 12 4.3 Referenzen ........................................................................................................................... 13 Bedingte Anweisungen und Schleifen...................................................................................... 14 5.1 Bedingte Anweisungen......................................................................................................... 14 5.2 Schleifen............................................................................................................................... 14 5.2.1 Die while-Schleife ........................................................................................................ 14 5.2.2 Die do-Schleife ............................................................................................................ 15 5.2.3 Die for-Schleife ............................................................................................................ 15 Funktionen................................................................................................................................... 16 6.1 Deklaration einer Funktion ................................................................................................... 16 6.2 Call-by-Reference versus Call-by-Value .............................................................................. 16 6.3 Vordefinierte Funktionen ...................................................................................................... 16 Begriffe, Schlüsselwörter, Zeichen ........................................................................................... 18 7.1 Begriffe ................................................................................................................................. 18 7.2 Schlüsselwörter .................................................................................................................... 19 7.3 Zeichen................................................................................................................................. 21 Programmierstile ........................................................................................................................ 22 9 10 8.1 OOP (Objekt orientierte Programmierung)........................................................................... 22 8.2 Entwicklung .......................................................................................................................... 22 Gedanken zur Programmierung ................................................................................................ 23 9.1 Entwicklungsstadien............................................................................................................. 23 9.2 Codeformatierung................................................................................................................. 23 9.3 Ratschläge: .......................................................................................................................... 23 Quellen ......................................................................................................................................... 24 10.1 Literatur ................................................................................................................................ 24 10.2 Tabellen................................................................................................................................ 24 Einführung in C++ 1 ____________________________________________________________ 1 Einführung Das folgende Skript wurde speziell für den Einstieg in C++ entworfen. Es werden nur die Grundlagen behandelt. Voraussetzungen. Trotzdem sollte man folgendes Vorwissen haben: - was ist eine Programmiersprache / wie funktioniert sie - was ist ein Compiler / Präcompiler - ich kann mit einem Compiler umgehen Es ist also von Vorteil, vorher schon mal mit einer Programmiersprache gearbeitet zu haben (z.B. 1 Java oder TopPascal). Die Syntax sieht der von Javaprogrammen sehr ähnlich. 1.1 Syntax Quellcode steht in dieser Schrift. Kommentare dazu werden durch // oder bei mehreren Zeilen durch /* eingeleitet (resp. durch */ beendet). Geschweifte Klammern {} werden in C++ zum Gruppieren benutzt und markieren beispielsweise Anfang und Ende von Funktionsrümpfen. Jedes Programm hat eine Startfunktion, die da lautet entweder main (für Konsoleanwendungen) oder aber WinMain (für windowsbasierende Anwendungen). int main() { // 0 wird zurückgegeben (Programm wird somit beendet) return 0; } Alle weiteren (selbst definierten) Funktionen müssen von der Hauptfunktion aus manuell aufgerufen werden. Hier die Syntax einer Funktion: Rückgabetyp Funktionsname(Parameter) { // lokale Deklarationen // Funktionsaufrufe } 1.2 Präcompiler Schlüsselzeichen (Direktiven) für den Präcompiler: #include #ifndef #define #endif Inkludierungen: Alle Dateien, aus denen man Code verwenden möchte, müssen per #include eingebunden werden. Der Compiler liest dann diese Dateien und fügt sie an der #include-Stelle ein. Include-Guards: Sie sorgen dafür, dass eine Datei nicht zweimal eingebunden wird. Um IncludeGuards zu verwenden, fügt man folgende Marken in eine Header-Datei ein: 1 Damit meint man den „Satzbau“. In C++ sieht das so aus: Datentyp Variablenname Semikolon Beispiel: int iTest; Einführung in C++ ____________________________________________________________ 2 #ifndef _TEST #define _TEST // hier kommt der Inhalt der Header-Datei hinein… #endif Wenn der Compiler die Header-Datei also ein zweites Mal lesen würde, dann wäre die Marke _TEST bereits definiert und der Compiler würde den gesamten Inhalt der Header-Datei ignorieren. Praktisch, nicht? Einführung in C++ 2 ____________________________________________________________ 3 Variablen, Makros und Konstanten Was Variablen sind, brauche ich wahrscheinlich nicht zu erklären. Der Unterschied zwischen Variablen und Konstanten dürfte auch klar sein: Den Konstanten kann im Gegensatz zu den Variablen 2 nur einmal ein Wert zugewiesen werden, und zwar direkt bei der Deklaration . Das heisst, Konstanten können gar nicht deklariert werden, sie müssen also direkt definiert werden! 2.1 - Tipps zu den Variablen das erste Zeichen einer Variable muss ein Buchstabe sein (der Unterstrich _ wird ebenfalls als Buchstabe betrachtet) - Gross- und Kleinschreibung spielen bei der Namensgebung eine Rolle (Vektor ≠ vektor) - sehr lange Namen sind zwar erlaubt, machen den Code jedoch unübersichtlich - sehr kurze Namen wie x sollten nur innerhalb eines kleinen Gültigkeitsbereiches – z.B. einer Schleife – vorkommen - der Name einer Variable soll also kurz und trotzdem verständlich sein - es kann hilfreich sein, die Variablen mit Präfixes zu versehen (vgl. weiter unten) - ein Variablenname darf nicht identisch mit einer vordefinierten Konstanten (z.B. NULL) oder einem Schlüsselwort (z.B. else) sein - Zeichen sind ebenfalls zu meiden (z.B. a~) - das Namensschema sollte konstant durchgehalten werden - es kommt zu Komplikationen, wenn für globale und lokale Variablen dieselben Namen verwendet werden - Deklariere Variablen erst, wenn sie wirklich gebraucht und auch sofort initialisiert werden können. - Globale Variablen sollten gleich bei der Deklaration initialisiert werden, wenn auch bloss mit ihren Default-Werten (z.B. NULL oder 0). 2.2 Makros Makros sind eine Art inline-Funktion. Sie werden direkt an der Leseposition eingefügt. Meistens verwendet man für Makro-Namen nur Grossbuchstaben und den Unterstrich. Beispiel: #define PRODUKT(x, y) (x * y) Wenn der Compiler im Quelltext auf PRODUKT(5, 7) stösst, wird an dieser Stelle 35 eingesetzt. Trotz der scheinbar komfortablen Funktion der Makros sollten sie nur dort eingesetzt werden, wo es wirklich sinnvoll ist. Denn der Code wird beim kompilieren geändert, noch bevor der Compiler ihn 2 Beispiel einer Deklaration: int iZahl; Beispiel einer Definition: int iZahl = 1; Einführung in C++ ____________________________________________________________ 4 richtig liest. Wenn das Makro fehlerhaft ist, kann dies zu einer langen Fehlersuche führen. Eine „sinnvolle“ Anwendung von Makros sind beispielsweise Include-Guards (sorgen dafür, dass eine Datei nicht zweimal includiert wird). 2.3 Konstanten Konstanten werden bei der Deklaration gleich Initialisiert. Reinitialisieren, wie wir es bei einer Variablen kennen, ist bei Konstanten nicht möglich. Ihr Wert bleibt während der ganzen Programmlaufzeit eben konstant! Zeilenumbrüche innerhalb von Konstanten sind nicht erlaubt. Definitionen über #define sind in C++ fast überflüssig. Um Konstanten zu definieren kann man auch const oder enum verwenden. Beispiel: 2.4 const float PI = 3.1415926535897932385; Präfix Vor Variablen sollte immer ein Präfix (= Vorsilbe) stehen, der angibt, von welchem Typ die Variable ist und wo im Code die Variable in die Welt gesetzt wurde (Dies trägt wesentlich zur Verständlichkeit des Codes bei). Liste der Typen und des entsprechenden Präfixes: Datentypen Datentyp Andere Präfixe Präfix Erklärung Präfix char, UCHAR c Pointer p BOOL b Array a WORD w Member m_ DWORD dw Global g_ int, UINT i float f double d long l LONGLONG ll Tab. 1: „Präfixe“ Beispiele: (Pointer auf char) char *Name ... wird durch Präfixes zu ... char *pchName (global, DWORD) DWORD Name ... wird durch Präfixes zu ... DWORD g_dwName Reihenfolge: Global / Member vor Pointer / Array vor Datentyp-Präfix Global heisst, dass die Variable ausserhalb einer Funktion, Klasse oder Struktur definiert wurde. Als Member bezeichnet man diejenigen Variablen, welche Attribute einer Klasse. Einführung in C++ ____________________________________________________________ 5 Anmerkung: Die oben genannten Präfixe sind nur Vorschläge und könnten natürlich frei gewählt werden. Wichtig ist nur, dass man immer dieselben verwendet, nicht einmal i und einmal n für int. Es spielt also keine Rolle, welches Präfix man für welche Typen benutzt. Wichtig ist nur, dass man das Schema konstant durchhält. Einführung in C++ ____________________________________________________________ 6 3 Datentypen 3.1 der Boolesche Typ Für den Booleschen (oder Booleanischen) Typ gibt es zwei Zustände: true und false resp. 1 und 0. Beispiel: 3.2 bool b = true; Zeichentypen Ein Zeichen kann in einer Variable vom Typ char gespeichert werden, eine Zeichenkette (String) in einem char-Array. Beispiele: char ch1 = ″a″; char ch2[4] = ″hallo″; 3.3 // beginnt bei 0 Ganzzahltypen Integer (int) gibt es in drei Formen (int, signed int und unsigned int) und drei Größen (short int, int, long int). Beispiel: 3.4 int i = 10; Gleitkommatypen Es stehen drei Grössen zur Verfügung: float (einfache Genauigkeit), double (doppelte Genauigkeit) und long double (erweiterte Genauigkeit). Beispiele: float f = 10.0f; double d = 3.14159; 3.5 Eigene Datentypen Um mehrere Daten zusammenzufassen, bieten sich Strukturen an. Beispiel: struct Personalien { char Name[36]; int Alter; int Grösse; }; Der Unterschied zwischen Klassen und Objekten liegt nur beim Zugriff auf die Daten: alle Elemente einer Struktur sind public und somit jedem Zugriff schutzlos ausgeliefert. Einführung in C++ 3.6 ____________________________________________________________ 7 Nicht typisierte Werte – void Vom Typ void gibt es keine Objekte. Somit ist es nicht möglich, eine Variable von diesem Typ zu deklarieren. Void wird auch als Universalzeigertyp für unbekannte Datentypen verwendet, was aber nur im Notfall zum Einsatz kommen sollte. Beispiele: void // diese Funktion gibt keinen Wert zurück funktion(); // void Pointer: zeigt auf ein unbekanntes Objekt void* pv; 3.7 Casting / Typumwandlung Eine Typumwandlung verwirrt den Compiler und kann zu Datenverlust führen. Deshalb sollte Casting nur in Notfällen angewandt werden. Beispiel: int i; double d1 = 0.63, d2 = 0.12; i = (int)(d1 + d2); Anm.: Das int in der Klammer gibt an, dass (d1 + d2) in int konvertiert werden sollen. Wird es weggelassen, so spuckt der Compiler eine Warnung aus. 3.8 Übersicht (Fettgedruckte Einträge gelten nur für 32bit-Systeme) Name Kleinster Wert Grösster Wert Grösse in Bit bool false true 8 (signed) char -128 127 8 unsigned char 0 255 8 enum -2.147.483.648 2.147.483.647 32 (signed) int -2.147.483.648 2.147.483.647 32 unsigned int 0 4.294.967.295 32 short int -32.768 32.767 16 (signed) long -2.147.483.648 2.147.483.647 32 unsigned long 0 4.294.967.295 32 float 3,4E-38 3,4E+38 32 double 1,7E-308 1,7E+308 64 long double 3,4E-4932 1,1E+4932 80 Tab. 2: „Übersicht über die Datentypen“ Vordefinierte Konstanten unter Windows: Name TRUE Äquivalent true, 1 Anmerkung Einführung in C++ ____________________________________________________________ 8 FALSE false, 0 NULL 0 UINT unsigned int 16bit bzw. 32bit BYTE unsigned char 8bit WORD unsigned short 16bit DWORD unsigned long 32bit LONG long 32bit VOID void Es gibt keine void-Objekte LPSTR char far* long-Zeiger auf einen String LPCSTR const char far* long-Zeiger auf einen konstanten String HANDLE void* allg. Handle für div. WindowsElemente HWND (nicht anwendbar) Handle zu einem Fenster WPARAM unsigned int 16bit bzw. 32bit LPARAM long 32bit LRESULT long 32bit HINSTANCE (nicht anwendbar) Handle der Instanz (oder Kopie) Tab. 3: „Windows Synonyme“ 3.9 - Ratschläge int (vor short und long), double (vor float und long double) sowie char (vor signed und unsigned char) - Konvertierungen in andere Typen vermeiden (kann zu Datenverlust führen) - Casting (Typumwandlung) ist in den meisten Fällen ein Indiz für einen Designfehler Einführung in C++ 4 ____________________________________________________________ 9 Zeiger, Felder und Strukturen Zeiger und Felder sind sehr ähnlich oder zumindest deren Verwendungszweck. Pointer können ebenfalls wie ein Array mit Werten gefüllt werden, wenn sie entsprechend initialisiert wurden. 4.1 Arrays / Felder Darunter versteht man eine Sammlung von Daten des gleichen Typs (kann auch ein selbstdefinierter Typ sein). Beachten sie, dass die Indizierung der Feldelemente stets bei Null beginnt. Beispiele: int zahl[3] = {5,1,4,9}; // Wertzuweisung int x[] = {5,1,4,9}; // so geht es auch zahl[0] = 22; // oder jedes einzelne Element initialisieren int a[5.3]; // Falsch! Keine Kommazahlen als Index! Int b[1] = {1, 2, 3}; // Falsch! Zu viele zugewiesene Werte char ch[8] = ″012345″ // Zeichenketten können unterbrochen werden ″789″; int matrix[2][2]; 4.2 // Mehrdimensionale Arrays sind erlaubt Pointer / Zeiger / Adressen Unter einem Pointer (= Zeiger) versteht man eine Variable, die angibt, wo im Speicher etwas steht. Ihr Inhalt ist eine Adresse (im Hauptspeicher). Beispiel: int a; int *b = &a; // dem Pointer b wird die Adresse und somit auch der Wert von a zugewiesen Anm.: a = 5; // b zeigt auf a und somit auf den Wert fünf int** c; // Pointer auf Pointer auf int - int** c meint dasselbe wie int **c - Mit & greift man auf die Adresse (Position im Speicher) einer Variable zu. Eine Adresse hat die Form 0x[achtstelliger Hexadezimalwert]. - Mit einem * vor einem Pointer greift man auf dessen Wert zu. Der Speicher kann auf Grund des Pointerkonzepts auf eine einfache Art und Weise verwaltet werden. Dazu bietet C++ die Operatoren new und delete an. Der Speicherplatz kann dadurch dynamisch allokiert und wieder freigeben werden. Ratschläge: - Benutze statt malloc() den new–Operator. Er ist um einiges flexibler. - vermeide Zeigerarithmetik (‚Zeigeroperationen’) Einführung in C++____________________________________________________________ 10 4.3 Referenzen Eine Referenz ist nichts anderes als ein Synonym für eine bestehende Variable. Sie werden vom Compiler als gleichwertige Namen benutzt. Beispiel: int a = 5; int& b = a; // a und b sind jetzt verschiedene Bezeichner für ein- und dieselbe Variable b = 6; // jetzt gilt: a = b = 6 Anstatt nun einer Funktion als Parameter den Wert einer Variable zu übergeben kann man auch eine Referenz übergeben. Beispiel: int b; funktion(b); // b wird als Parameter übergeben void funktion(int &a) { a = 6; } // nun hat b auch den Wert 6, denn a und b meinen // dieselbe Variable Einführung in C++____________________________________________________________ 11 5 Bedingte Anweisungen und Schleifen 5.1 Bedingte Anweisungen Die Anweisung wird nur ausgeführt, wenn die Bedingung erfüllt wird (d.h., wenn sie in ihrer Gesamtheit zutrifft): Beispiel: if (Geburtstag) // ist dasselbe wie if (Geburtstag == true) Karte_Schreiben(); Beispiel: if (Geb == heute) Karte_Schreiben(); else if (Geb == morgen) Erinnerungsnotiz; // heute Geburtstag? // wenn ja, dann Karte schreiben… // wenn nein, hat er morgen Geburtstag? // wenn ja, dann eine Notiz machen… // ansonsten nichts tun else ; In bestimmten Fällen kann auch die sogenannte switch-Anweisung genutzt werden: Beispiel: switch (Resultat) // wenn „Resultat“ gleich ... { case 10: // ... 10, { // Anweisung } case 20: // ... 15, { // Anweisung } default: break; // wenn keiner der Fälle (‚cases’) zutrifft... // unterbreche die Abfrage } 5.2 Schleifen Eine Schleife enthält mindestens eine Abbruchbedingung. Die nachfolgenden Anweisungen / Befehle werden solange ausgeführt, bis die Bedingung erfüllt ist. Enthält eine Schleife mehrere Anweisungen, so müssen diese durch Klammern eingegrenzt werden: { Anweisung1; Anweisung2; } Durch das Schlüsselwort continue wird der aktuelle Schleifendurchgang unterbrochen (bei der forSchleife wird der Schleifenzähler um eins erhöht) und der nächste gestartet. Mit break wird die Schleife sofort verlassen. 5.2.1 Die while-Schleife Solange die Bedingung zutrifft, wird die Schleife nicht verlassen. Syntax: while(Bedingung) Befehl; Einführung in C++____________________________________________________________ 12 Beispiel: while(Key_nicht_gedrückt) // Warten auf eine Eingabe des Benutzers ; // tue nichts 5.2.2 Die do-Schleife Dieser Schleifentyp kommt eher selten zum Einsatz. Der Wesentliche Unterschied zur while-Schleife besteht darin, dass es mindestens einen Durchgang gibt. D.h. es wird zuerst etwas durchgeführt, erst dann wird das Abbruchkriterium geprüft. Syntax: do{ Anweisung; } while(Bedingung); 5.2.3 Die for-Schleife Beispiel: for(Variable; Abbruchbedingung; Erhöhungsschritt) Befehl; Anwendung: z.B. Daten vom einen zum anderen Arrray kopieren: for(int i=0; i<Anz; i++) Array1[i] = Array2[i]; // mit Anz ist der grösste Index der Arrays gemeint Einführung in C++____________________________________________________________ 13 6 Funktionen 6.1 Deklaration einer Funktion Syntax: Rückgabetyp Funktionsname (Parameter); Rückgabetyp: kann ein beliebiger Datentyp (auch ein Pointer) sein Wenn der Rückgabetyp ungleich void ist, dann muss am Ende einer Funktion das Schlüsselwort return stehen. Parameter: werden übergeben, weil die Funktion diese Werte zum Rechnen benötigt Beispiele: int quadrieren(int x) // ein Integer als Parameter { return (x*x); // ein Integerwert wird zurückgegeben } const char* Benutzername() // keine Parameter { return ″Rudolf″; // eine Konstante wird zurückgegeben } Synonyme: Funktion, Methode, Modul, Prozedur (obwohl es geringe Unterschiede zwischen diesen Begriffen gibt, verwendet man sie meist als Synonyme) Tipp: Funktionen sollten nicht zu lang werden, besser in kleine Happen aufteilen, dies macht den Code übersichtlicher! 6.2 Call-by-Reference versus Call-by-Value Bei Call-by-Reference wird eine Referenz oder ein Pointer als Parameter übergeben, das heisst, die Funktion kann den Wert der übergebenen Referenz ändern. Bei Call-by-Value wird mit return gearbeitet. Der Übergebene Wert ist wirklich nur eine Zahl / eine Zeichenkette, das heisst, wenn die Werte verändert werden, hat dies keinen Einfluss auf die Variable, die der Funktion übergeben wurde. Call-by-Value ist einiges Langsamer, da ein Wert (‚Value’) übergeben werden muss. Wenn man zwar eine Referenz verwenden, den Wert der Referenz von der Funktion aber nicht verändern lassen möchte, dann kann man das Schlüsselwort const bei der Funktionsdeklaration setzen. 6.3 Vordefinierte Funktionen Unter Windows stehen einige vordefinierte Funktionen zur Verfügung. Hier eine Auswahl: main / WinMain mögliche Startfunktionen eines Windows-Programms sin / sinf der Sinus einer (float-) Zahl cos / cosf der Cosinus einer (float-) Zahl tan / tanf der Tangens einer (float-) Zahl abs / fabs / fabsf der absolute Wert einer (ganzen / double- / float-) Zahl sqrt / sqrtf die Wurzel Einführung in C++____________________________________________________________ 14 pow / powf potenzieren printf Textausgabe in das Konsolefenster sprintf Text in ein char-Array schreiben strcmp vergleicht zwei char-Arrays sscanf durchsucht einen String nach einer Zahl fprintf Text in eine Datei schreiben fopen Datei öffnen (intern) fseek schiebt den Lesecursor in der Datei weiter / zurück fscan durchsucht die Datei nach einer Zahl fclose Datei schliessen MessageBox öffnet ein Dialogfeld DialogBox öffnet eine Dialog-Box ShellExecute öffnet eine Datei (für den Benutzer sichtbar) CoInitialize COM registrieren CoUnitialize COM beenden TranslateMessage Nachricht übersetzen DispatchMessage Nachricht verarbeiten (Windows-Standardverarbeitung) Sleep legt den Thread schlafen (Prozessorleistung reduzieren) GetModuleFileName liefert den Namen der Anwendung inkl. Pfad mciSendString diverse Funktionen (z.B. Öffnen des CD-ROM Laufwerks) Die Parameter dieser Funktionen können in der Dokumentation von Visual C++.NET nachgelesen werden. Einführung in C++____________________________________________________________ 15 7 Begriffe, Schlüsselwörter, Zeichen 7.1 Begriffe Deklaration Bevor eine Variable benutzt werden kann, muss sie deklariert werden. Beispiele: char ch; int a, b; // meint dasselbe wie int a; int b; Definition Eine Variable zu definieren heisst nichts anderes, als ihr einen Wert zuzuweisen. Beispiel: char ch = ″a″; int i = 1; Syntax Definiert die Anordnung von Elementen, also dessen Reihenfolge. Zur Syntax von C++ gehört beispielsweise das Semikolon am Ende einer Zeile. Beispiel: Datentyp Variblenname = Wert; globale Variablen (globals) Eine Variable wird als global bezeichnet, wenn sie ausserhalb einer Funktion, einer Struktur oder einer Klasse deklariert wurde. Vererbung und Polymorphismus Unter Vererbung versteht man die Ableitung eines Objekts von einem anderen, wobei alle Merkmale und Fähigkeiten an das neue Objekt mitgegeben werden. Beispiel: Die Basisklasse könnte Beispielsweise ‚Waffe’ heissen. Davon könnte man Klassen mit dem Namen AK-47, M60 oder Thompson ableiten, die alle Grundfunktionen der Basisklasse vererbt bekommen (z.B. Feuern, Nachladen, …). Die Polymorphie macht es nun möglich, dass ein Objekt die geerbte Funktion abändern kann, um sie den eigenen Bedürfnissen anzupassen. Beispiel: Man lädt ja nicht jede Waffe auf die gleiche Weise nach. So heissen die Methoden zum Nachladen aller Objekte gleich und bringen auch dasselbe Resultat, aber deren Funktionsweise ist eine andere. Weitere wichtige Begriffe Funktionen, Methoden, Allokierung, Destruktor, Konstruktor, Compiler, compilieren ( kompilieren), Präcompiler, Direktiven (Anweisungen für den Compiler?), Parameter, Makro, Gültigkeitsbereich, akquirieren (engl. acquire), Einführung in C++____________________________________________________________ 16 7.2 Schlüsselwörter Schlüsselwörter werden in der Programmierebene blau hervorgehoben. Hier sind einige davon erklärt: class Eine Klasse definieren. struct Eine Struktur definieren extern Mit extern definierte Variablen sind bereits an einer anderen Stelle im Quellcode definiert worden. Man setzt extern davor, damit der Compiler nicht meckert. include (‚einbinden’). Durch diesen Befehl werden sozusagen zwei Dateien miteinander verknüpft. ifndef, endif Man benutzt die folgenden Direktiven, um auszuschliessen, dass derselbe Code mehrfach kompiliert wird. Dazu kommt es, wenn in einer Header-Datei alle anderen Header per #include eingebunden werden. Bei der Zeile #ifndef Test (if not defined „Test“) prüft der Präcompiler, ob das Symbol Test bereits definiert ist. Ist dies der Fall, so wird der nachfolgende Quelltext (bis zur Marke #endif) einfach ignoriert. ifndef ist also quasi eine Direktive für die bedinge Übersetzung in die Maschinensprache. Würde man keine so genannten Include-Wächter (Include-Guards) verwenden, dann würden eventuell einige Header-Dateien mehrmals eingelesen und es käme zu Mehrfachdefinitionen und Kollisionen von Makronamen. define Mit #define werden Makros oder Konstanten definiert. enum Das Schlüsselwort enum hat eigentlich dieselbe Bedeutung wie #define, nur werden den mit enum definierten Konstanten keine Werte zugewiesen. continue Wird vor allem im Zusammenhang mit Schleifen verwendet. Es bricht den aktuellen Schleifendurchgang ab. inline Das Schlüsselwort inline vor einer Funktion bewirkt, dass der Inhalt dieser Funktion beim Kompilieren (Linker) überall an die Stellen kopiert wird, an denen sie aufgerufen wurde (ähnlich wie bei einem Makro). Während der Programmlaufzeit muss diese Funktion dann nicht mehr aufgerufen werden. Dadurch wird Rechenzeit gespart, dafür aber mehr Speicher verpuffert. public Einführung in C++____________________________________________________________ 17 Auf public-Elemente kann von jedem Ort der Engine aus (innerhalb der Klasse, in abgeleiteten Klassen und von ausserhalb) zugegriffen werden. private Bei private kann nur von innerhalb der Klasse auf das Element zugegriffen werden. protected Ein protected-Member verhält sich wie ein private Member, mit einer Ausnahme: Abgeleitete Klassen haben Zugriff auf die protected-Elemente ihrer Basisklassen. Weiterhin kann eine beliebige Klasse mit dem Schlüsselwort friend Zugriff auf die protected Members bekommen union Union verwendet man in Strukturen oder Klassen und bedeutet, dass sich mehrere Variablen den gleichen Speicherplatz teilen. Daher kann immer nur eine von ihnen gleichzeitig genutzt werden. Wenn der Wert der einen Variablen verändert wird, so passt sich der Wert des korrespondierenden Elements automatisch an. const Für die Definition einer Konstanten. operator Mit dem Schlüsselwort operator können eben Operatoren für Klassen definiert werden. Somit können zwei Objekte derselben Klasse z.B. mit einem Plus verknüpft werden. Ist dies der Fall, wird die Methode operator +() dieser Klasse aufgerufen. new Damit kann einem Pointer Speicher zugewiesen werden. delete Damit wird ein Pointer gelöscht. break Bricht eine Schleife oder eine switch-Anweisung ab. continue Bricht den aktuellen Schleifendurchgang ab und erhöht den Schleifenzähler. inline Per inline definierte Funktionen sind sehr schnell. Sie werden wie Makros beim Kompilieren an der Leseposition eingefügt, sind aber sicherer als Makros. static Von Klassen, die Attribute und Methoden beinhalten, die das Schlüsselwort static tragen, kann nur ein Objekt erstellt werden. Einführung in C++____________________________________________________________ 18 7.3 Zeichen Arithmetische Operatoren Vergleichsoperatoren Sonstige + Addition == gleich && und - Subtraktion != ungleich | bitweise kombinieren * Multiplikation ! einen booleschen Wert umkehren & bitweise überprüfen / Division < kleiner als \n Zeilenumbruch % Modulo (liefert den Rest nach Division) > grösser als \a ASCII-Zeichen Bel (erzeugt Piepston) ++ erhöht um eins <= kleiner gleich << ein Bit nach links += x Erhöht um x >= grösser gleich >> ein Bit nach rechts = Zuweisungsoperator || oder Tab. 4: „Präfixe“ Der Compiler ‚kennt’ die Punkt-vor-Strich Regel. Im Zweifelsfall oder zur Verdeutlichung können natürlich trotzdem Klammern gesetzt werden. Einführung in C++____________________________________________________________ 19 8 Programmierstile 8.1 OOP (Objekt orientierte Programmierung) Eine Klasse enthält Daten (Attribute) und Funktionen (Methoden). - public meint öffentlich, also ohne Schutz - private oder protected meint, dass diese Daten nur von den innerhalb dieser Klasse deklarierten Funktionen genutzt werden können. Eine Funktion, die den gleichen Namen wie die Klasse trägt, heisst Konstruktor genannt. Der Konstruktor einer Klasse wird beim Erzeugen eines neuen Objekts einer Klasse aufgerufen. Der Destruktor dient zur Freigabe des Objekts. Von einer Klasse, die nicht als static deklariert wurde, können beliebig viele Objekte erstellt werden. Über die Objekte kann man auf die public-Elemente der Klasse zugreifen. 8.2 Entwicklung - anfangs nur lineare Programmabläufe (keine Funktionen oder Klassen) - danach modulare Programmierung – eine Funktion ruft die andere auf (Codelänge und Arbeitsaufwand drastisch reduziert). - Objekt orientierte Programmierung – Unterteilung des Programms in Klassen (Programme werden überschaubar) Einführung in C++____________________________________________________________ 20 9 Gedanken zur Programmierung 9.1 Entwicklungsstadien Bei der Entwicklung eines Programms wird die Arbeit in folgende Kapitel aufgeteilt: - Planung - Implementierung (Umsetzung in ein Programm) - Optimierung - Test (Fehler beheben) - Dokumentation Zur Implementierung kann ich aus eigener Erfahrung sagen, dass sich Trial and Error bewährt. Klar ist es nicht immer sinnvoll, besonders für fortgeschrittene Programmierer, jeweils nach fünf neuen Zeilen Code wieder zu kompilieren. Für Anfänger ist diese Taktik jedoch zu empfehlen. 9.2 Codeformatierung Ohne Codeformatierung geht’s fast nicht. Übersichtlichkeit ist sehr wichtig, besonders in grösseren Projekten. Hier ein paar Tipps zur Gestaltung. Kommentare Halten sie Kommentare kurz und präzise. Sie müssen sinnvoll und auf dem neusten Stand sein. Kommentare sollen schliesslich helfen, den Code besser zu verstehen. Überflüssige Kommentare machen den Code nur unnötig unübersichtlich: int a = 0; // Variable a wird initialisiert Klammern Die geöffnete und die geschlossene Klammer sollten immer auf einer vertikalen Linie sein, sodass man schnell erkennen kann, wo eine Anweisung beginnt und wo sie aufhört. 9.3 Ratschläge: - Gute Planung führt zum Erfolg! Planung ist das A und O eines jeden Programms. - achte auf eine konstante Codeformatierung und Namensgebung - verpasse verwandten Variablen, Klassen und Funktionen gemeinsame Namensbereiche - meide globale Variablen - fasse Variablen und Funktionen in Klassen zusammen - halte die Kommentare kurz und treffend - eine Klasse / eine Funktion soll von einer anderen möglichst unabhängig funktionieren! - „Trial and Error“: Mut zum Experimentieren! Nichts gelingt gleich auf Anhieb und ohne Verbesserungen! Einführung in C++____________________________________________________________ 21 10 Quellen 10.1 Literatur Websites: http://tau.fesg.tu-muenchen.de/~dieter/oop/cppdaten.php [Stand: 04.07.04] http://html-tut.webmaster-eye.de/javascript/objektorientiert.htm [Stand: 09.10.05] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_static.asp [Stand: 09.10.05] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfStaticPG.asp [Stand: 09.10.05] http://www.zfx.info [Stand: 09.10.05] http://www.dpunkt.de/java/Die_Sprache_Java/Objektorientierte_Programmierung/8.html [Stand: 10.10.05] Bücher Stroustrup, Bjarne (2000). Die C++ Programmiersprache. München: Addison-Wesley Verlag (ISBN: 3-8273-2058-5) 10.2 Tabellen Tab.2 + 3: http://www.datasource.de/programmierung/tab33_cppdatentypen.html [Stand: 03.07.04] Tab.1 + 4: Eigenproduktion © 2005 by Reto Da Forno | http://www.keepcoding-development.ch.vu Der Inhalt des Dokuments basiert auf meinem durch die oben genannten Quellen erworbenen Wissen. Fehler oder Irrtümer vorbehalten.