Next: Contents Contents Index
© 2002 by Thomas Wieland. Einige Rechte vorbehalten
Contents
Vorwort zur zweiten Auflage
Vorwort zur ersten Auflage
Dieses Buch ist für alle,
Ziele und Besonderheiten des Buchs
Voraussetzungen
Organisation des Buchs
Typografische Konventionen
Aktuelle Ergänzungen
Danksagungen
Programmieren unter Linux
Das Unix-Betriebssystem
Die Unix-Familie
Besondere Eigenschaften von Unix
Die Werkzeug-Philosophie
Linux
Der Kernel
Distributionen
Kompatibilität und Portabilität
Kommerzielle und freie Software
Das GNU-Projekt
Die GNU General Public License
Andere Open-Source-Ansätze
Vorteile von Open Source
Motivation für Open Source
Fazit
Programmentwicklung in Unix
Wichtige Begriffe
Compiler
Dateiarten
Systemdateien zur Entwicklung
Programme
Bibliotheken
Header-Dateien
Übungsfragen
Grundlagen der objektorientierten Programmierung in C++
Grundideen
Beherrschung der Komplexität
Rückblick auf strukturiertes Programmieren
Prozeduren und Module
Probleme der strukturierten Programmierung
Objekte
Klassen
Hintergrund
Die wesentlichen Kennzeichen einer Klasse
Methoden und Prozessabstraktion
Datenabstraktion
Zusammenfassung
Übungsaufgaben
Die C++-Programmiersprache
Historisches
C++ und C
C++ und Linux
Neuerungen im GCC 3.0
Das erste C++-Programm
Kommentare
Variablen
Operatoren
Strukturierungselemente
Präprozessor-Anweisungen
Die Hauptfunktion
Datentypen und Typumwandlung
Die elementaren Datentypen
Implizite Typumwandlung
Explizite Typumwandlung
Aufzählungstypen
Überblick
Prioritäten
Der Inkrementoperator
Der Bedingungsoperator
Die Maximum- und Minimumoperatoren
Ausdrücke
Umgang mit dem GNU-C++-Compiler
Installation
Aufruf und Optionen
Name für die ausführbare Datei
Debug-Informationen
Fehler und Warnungen
Kompilierung zur Objektdatei
Pfade zu Header-Dateien
Optimierung
Info-Seiten
Editieren mit NEdit und anderen
Klassen und Objekte
Klassendeklaration und -definition
Deklaration
Definition und Bereichsoperator
Objekte von Klassen
Zugriffsbeschränkungen
Freunde
Funktionen und Methoden
Funktionen in C++
Rückgabewert
Funktionsname
Argumentliste
Funktionskörper
Return-Anweisung
Der Prototyp
Überladen von Funktionen
Überladen von main()
Vorgabewerte für Parameter
Referenzen und Parameterübergabe
Regeln für Referenzen
Parameterübergabe als Referenz
Konstanten und Referenzen
Konstante Methoden
Zugriffsroutinen
Inline-Funktionen
Deklaration als inline
Klassenmethoden als inline
Konstruktoren und Destruktoren
Überblick über Konstruktoren
Besondere Eigenschaften
Arten von Konstruktoren
Standardkonstruktor
Allgemeine Konstruktoren
Initialisierung mit Listen
Kopierkonstruktor
Objekte als Rückgabewerte
Typumwandlungskonstruktor
Destruktoren
Syntax des Destruktors
Gültigkeitsbereiche von Objekten
Beispiel: Benutzerinformationen
Die Benutzerverwaltung unter Linux
Die Klassendeklaration
Benutzerinformationen aus der ID
Einsatz der Klasse
Vererbung und Polymorphismus
Basisklassen und abgeleitete Klassen
Vererbung in C++
Überschreiben von Methoden
Typumwandlung von abgeleiteten Klassen
Vererbungshierarchien
Vorteile der Vererbung
Erzeugung von Unterklassenobjekten
Mehrfachvererbung
Polymorphismus
Grundprinzip
Virtuelle Methoden
Rein virtuelle Funktionen und abstrakte Klassen
Programmieren mit C++
Basiselemente
Bedingungen
Typische Fehler bei if-Anweisungen
Abkürzende Schreibweisen
Beispiel: Telefontarife und Uhrzeitbestimmung
Mehrfache Auswahl
Beispiel: Auslesen von Kommandozeilenparametern
Schleifen
Schleife mit Anfangsüberprüfung
Schleifen mit Überprüfung am Ende
for-Schleifen
Ein Beispiel für while-Schleifen: Nachrichtenübermittlung zwischen zwei Prozessen
Schleifenkontrolle
Dateien und Ströme
Standardein- und -ausgabe
Ein- und Ausgabe mit Dateien
Öffnen der Datei
Schließen einer Datei
Ein- und Ausgabe
Fehlerbehandlung
Positionierung des Dateizeigers
Ausgabeformatierung
Auffüllen auf vorgegebene Breite
Genauigkeit von Gleitkommazahlen
Weitere Ausgabeflags
Beispiel: Umrechung DM - Euro
String-Streams
Eindeutigkeit der Ausgabe über die Prozess-ID
Aufruf anderer Programme
Felder, Zeiger und dynamische Speicherverwaltung
Felder (Arrays)
Zeichenketten
Zeiger
Was ist ein Zeiger?
Syntax bei Zeigern
Zeiger und Arrays
Nullzeiger
Dynamische Speicherverwaltung
Dynamisches Reservieren von Speicher mit new
Freigeben von dynamisch angelegten Objekten mit delete
Neuralgische Punkte bei der dynamischen Speicherverwaltung
Dynamisch erzeugte Felder
Kopierkonstruktoren
Destruktor
Beispiel: CGI-Programmierung
Der Apache-Webserver
Formulare
Informationsübertragung an den Server
Die Serveranwendung
Bestimmung der Anfragemethode
Pufferung der Eingabe
Zerlegung der übergebenen Zeichenkette
Erzeugung einer Antwortseite
Die verkettete Liste
Die C-Bibliothek
Umfang der C-Bibliothek
Die Header-Dateien
Die verschiedenen Anwendungsbereiche
Das man-Kommando
Mathematische Standardfunktionen (cmath)
Numerische Limits (climits und cfloat)
Auswertung von Fehlern bei Bibliotheksfunktionen (cerrno)
Behandlung von Signalen (csignal)
Signale interpretieren
Signale versenden
Signale abfangen
Allgemeine Utilities (cstdlib)
Umwandlung von char-Strings in Zahlen
char
Zufallszahlenerzeugung
Quick-Sort
Programmbeendigung
Zugriff auf Umgebungsvariablen
Ein- und Ausgabefunktionen (cstdio)
Zugriff auf und Manipulation von char-Strings (cstring)
Eigene Bibliotheken
Statische Bibliotheken
Beispiel: Zugriff auf Verzeichnisse
Dynamische Bibliotheken (shared libraries)
Tipps und Konventionen
Namenskonventionen
Projektorganisation
Programmierstil
Sicheres Programmieren
C++-Programmierstil
Fortgeschrittenes C++
Namensräume
Definition
Der Namensraum std
std
Zugriff auf Bezeichner in Namensräumen
Explizite Angabe des Namensraums
Das Schlüsselwort using
using
Zusammenfassung mehrerer Namensräume
Verschachtelte Namensräume
Templates
Funktionstemplates
Ausprägung
Explizite Ausprägung
Spezialisierung von Funktionstemplates
Organisation des Quelltextes
Klassentemplates
Design mit Templates
Implementierung
Beispiel: Vektor
Einsatz mit Standardtypen
Einsatz mit eigenen Typen
Verschachtelte Templates
Vorgabewerte für Templateparameter
Die STL: die Containerklassen der C++-Standardbibliothek
Strings
Container
Vektoren
Listen und Stacks
Iteratoren
Algorithmen
Suchen und Ersetzen
Sortieren
Prädikate
Operatoren zur Typumwandlung
Der static_cast-Operator
Der dynamic_cast-Operator
Der const_cast-Operator
Der reinterpret_cast-Operator
Überladen von Operatoren
Operatorfunktionen und -methoden
Operatorfunktionen
Operatormethoden
Arten von Operatoren
Der Indexoperator
Lesezugriff
Schreibzugriff
Der Zuweisungsoperator
Zuweisung bei Objekten mit dynamisch reserviertem Speicher
Selbstzuweisung
Weitere Tipps
Vergleiche und mathematische Operatoren
Komplexe Zahlen
Kombinierte Verknüpfung und Zuweisung
Vergleiche
Operatoren als Freunde
Ein- und Ausgabeoperator
Typumwandlungsoperator
Allgemeine Prinzipien
Operatoren in Templateklassen
Orientierung an Standardoperatoren
Ausgewogene Operatoren
Ausnahmebehandlung (Exceptions)
Behandlung von Fehlersituationen
Exception Handling
Allgemeine Syntax
Ausnahmeobjekte
Auffangen der Ausnahmen
Weiterwerfen
Angabe von Ausnahmen in Schnittstellen
Exception-Objekte als Hierarchie
Exceptions und die Standardbibliothek
Tipps und Hinweise
Editoren für die Programmierung
vi improved
Starten und Beenden
Die Bearbeitungsmodi
Bewegen des Cursors
Text schreiben und löschen
Änderungen rückgängig machen
Text löschen
Speichern und Laden
Kopieren und Verschieben
Text im Puffer speichern
Text einsetzen
Weitere Befehle
Der XEmacs-Editor
Grundlegende Befehle
Aufbau des Fensters
Bewegung des Cursors
Löschen von Text
Puffer
Fenster und Rahmen
Dateien anlegen, öffnen und speichern
Rückgängig
Hilfe
Inkrementelle Suche
Suche nach regulären Ausdrücken
Ausschneiden, Kopieren und Einfügen
Mit der Tastatur
Mit der Maus nach Emacs-Art
Mit der Maus nach XEmacs-Art
Modi
Darstellung der Puffer-Modi
Auswirkungen des Hauptmodus
Die Konfigurationsdatei
Weitere Editoren
Glimmer
Die Oberfläche
Textoperationen
Glimmer anpassen
Weitere Funktionen
KWrite
Dateien öffnen
Markieren
XCoral
Quelltexteinfärbung
Einfügen von Programmrümpfen
Der Klassenbrowser
Und was sonst?
Werkzeuge für die Softwareentwicklung
Steuerung der Übersetzung mit Make-Dateien
Aufbau von Makefiles
Besondere Zeichen
Abhängigkeiten
Regeln
Mehrere Ziele
Arbeiten mit make
Kommandozeilenoptionen
Fehler
Makros
Eingebaute Regeln
make für Fortgeschrittene
Beschränkung der Aktivität
Mehrere Jobs gleichzeitig
Automatische Erzeugung von Abhängigkeiten
Fehlersuche mit dem Debugger
Theoretische Fehlerquellen
Designfehler
Datenveränderungen
Bedingte Kompilierung
Rechen- und Rundungsfehler
Abstürze und Core-Dateien
Typische Fehlerquellen
Statusausgaben im Code
Ein fehlerhaftes Programm
Die Schnittstelle der Matrix-Klasse
Die main()-Funktion
Fehlersuche mit gdb
Vorbereiten des Programms
Start des gdb
Start eines Programms
Haltepunkte
Ausgabe von Programmcode
Einzelschritte und Fortsetzung
Verfolgung der Aufrufkette
Untersuchung von Variablen
Beenden der Debug-Sitzung
Weitere Fähigkeiten
Der grafische Debugger DDD
Elementare Bedienung
Die grafische Datenanzeige
Fehlervermeidung durch die Überprüfung von Vorbedingungen
Versionskontrolle mit RCS und CVS
Versionskontrolle mit Linux
Vorgehensweise
Versionsverwaltung mit RCS
Konfiguration bei RCS-Projekten
Registrieren
Einchecken
Auschecken
Überblick über Änderungen
Einheitliches Etikett
Schlüsselwörter im Quelltext
Versionsverwaltung mit CVS
Grundlegende Konzepte
Erstellen des CVS-Archivs
Konfiguration für die lokale Entwicklung
Konfiguration des Passwortservers
Weitere administrative Eingriffe
Vorgehensweise eines Entwicklers
Einrichten eines Arbeitsverzeichnisses und Importieren
Hinzufügen
Aktualisieren und Freigeben
Dateien aus dem Archiv löschen
Cervisia
Integrierte Entwicklungsumgebungen
XEmacs als IDE
Der Editor
Start des Compilers
Start des Programms und des Debuggers
Versionsverwaltung mit XEmacs
Dateivergleich mit Ediff
KDevelop
Installation und Konfiguration
Die KDevelop-Entwicklungsumgebung
Das Hauptfenster
Navigation und Hilfe
Der Anwendungsassistent
Die Projekteinstellungen
Mit Konsolenanwendungen arbeiten
Eine neue Anwendung beginnen
Vorhandene Projekte mit KDevelop verwalten
KDE-Anwendungen mit KDevelop entwickeln
Beispiel: Berechnung des Body-Mass-Index
Signale und Schlitze
Der Qt-Designer
Implementierung der Anwendung
Probleme beim Übersetzen der Anwendung
Source Code Engineering mit SNiFF+
Projekte in SNiFF+
Überblick über die SNiFF-Umgebung
Der Symbolbrowser
Der Hierarchiebrowser
Abhängigkeiten von Header-Dateien
Editieren, Kompilieren und Debuggen
Editor
Kompilieren und Generieren
Der Debugger
Weitere Entwicklungsumgebungen
Source Navigator
CodeWarrior
Eclipse
Die Idee von Eclipse
Die Eclipse-Plattform unter der Haube
Eclipse als IDE
Bibliography
Index