C++

objektorientierte Programmiersprache
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 5. September 2004 um 20:38 Uhr durch 217.225.73.221 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

C++ ist eine prozedurale Programmiersprache für allgemeine Anwendungen und stellt Sprachmittel für abstrakte Datentypen sowie modulare, generische, objektorientierte und strukturierte Programmierung zur Verfügung. C++ basiert auf der Programmiersprache C wie in ISO/IEC 9899:1990 beschrieben.

Zusätzlich zu den in C vorhandenen Möglichkeiten bietet C++ weitere Datentypen, Klassen mit Vererbung und virtuellen Funktionen, Ausnahmebehandlung, Templates (Schablonen), Namensräume, Inline-Funktionen, Überladen von Operatoren und Funktionsnamen, Referenzen, Operatoren zur Freispeicherverwaltung und eine erweiterte Bibliothek.


Entstehungsgeschichte

C++ wurde von Bjarne Stroustrup seit 1979 bei AT&T entwickelt. Die Idee für eine neue Programmiersprache entstand dabei aus den Erfahrungen, die er während seiner Promotionsarbeit gesammelt hatte. Stroustrup fand die Sprache Simula hilfreich für die Entwicklung großer Software-Projekte, für praktische Anwendungen war sie aber zu langsam in der Ausführung. Demgegenüber war die Sprache BCPL zwar schnell, aber zu maschinennah und nicht geeignet für die Entwicklung großer Software-Projekte.

Als Stroustrup in den Bell-Laboratorien zu arbeiten begann, sah er sich mit dem Problem konfrontiert, den UNIX-Betriebssystemkern im Hinblick auf verteilte Programmierung analysieren zu müssen. Mit den Erfahrungen aus seiner Promotion machte er sich daran, die Programmiersprache C um ein Klassenkonzept zu erweitern, für das die Sprache Simula-67 das primäre Vorbild war.

Die Wahl fiel auf C, weil C eine Vielzwecksprache war, schnellen Code produzierte und einfach auf andere Plattformen zu portieren war. Als dem Betriebssystem UNIX beiliegende Sprache hatte C außerdem eine nicht unerhebliche Verbreitung. Zunächst fügte er der Sprache Klassen (mit Datenkapselung) hinzu, dann abgeleitete Klassen, ein strengeres Typsystem, Inline-Funktionen und Standard-Argumente.

Während Stroustrup "C mit Klassen" ("C with Classes") entwickelte (woraus später C++ wurde), schrieb er auch Cfront, einen Compiler, der aus C mit Klassen zunächst C-Code als Zwischenresultat erzeugte. Die erste kommerzielle Version von Cfront erschien im Oktober 1985.

1982 wurde C mit Klassen in C++ umbenannt. Erweiterungen darin waren: virtuelle Funktionen, Überladen von Funktionsnamen und Operatoren, Referenzen, Konstanten, änderbare Freispeicherverwaltung, verbesserte Typüberprüfung, und eine andere Art von Kommentaren (//).

1985 erschien die erste Version von C++, die eine wichtige Referenzversion darstellte, da die Sprache damals noch nicht standardisiert war. 1989 erschien die Version 2.0 von C++. Neu darin waren Mehrfachvererbung, abstrakte Klassen, statische Elementfunktionen, konstante Elementfunktionen und die Erweiterung des Schutzmodells um "protected". 1990 erschien das Buch "The Annotated C++ Reference Manual", das als Grundlage für den darauffolgenden Standardisierungsprozess diente.

Relativ spät wurden der Sprache Templates, Ausnahmen, Namensräume, neuartige Typumwandlungen und boolesche Typen hinzugefügt.

Im Zuge der Weiterentwicklung der Sprache C++ entstand auch eine gegenüber C erweiterte Standardbibliothek. Erste Ergänzung war die Stream-I/O-Bibliothek, die Ersatz für traditionelle C-Funktionen wie zum Beispiel printf und scanf bietet. Eine der wesentlichen Erweiterungen der Standardbibliothek kam später durch die Integration großer Teile der bei HP entwickelten "STL" hinzu.

Nach jahrelanger Arbeit wurde schließlich 1998 von der ISO die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt.

Die nächste Version der Sprache C++ erscheint voraussichtlich noch in dieser Dekade (C++0x).


Merkmale

Nach B. Stroustrup unterstützt C++ die folgenden Programmiertechniken:

Siehe auch: Programmierparadigma, Entwurfsmuster, RAII (Abkürzung für engl. resource acquisition is initialization)

Stärken und Schwächen

Stärken:

  • Die Erzeugung hocheffizienten Codes ist möglich.
  • Sowohl maschinennahe als auch hochabstrakte Programmierung ist möglich.
  • Sehr hohe Ausdrucksstärke und Flexibilität - Beispiel: die anpassbare Freispeicherverwaltung, in die sich zum Beispiel nahtlos eine Garbage-Collection integrieren lässt
  • Für große Projekte geeignet
  • Weite Verbreitung
  • Die Sprache ist nicht im Besitz einer Organisation (im Unterschied zu beispielsweise Java).
  • Kompatibilität mit C - Vorteil: Es steht eine breite Codebasis zur Verfügung.

Schwächen:

  • Kompatibilität mit C - Nachteil: historischer Ballast muss mitgeschleppt werden, zum Beispiel der von C übernommene Präprozessor
  • Die aktuellen Compiler (Stand: 2004) sind rückständig im Bezug auf die Umsetzung der ISO-Norm.
  • Die aktuellen Compiler produzieren nicht immer optimalen Code, sowohl im Bezug auf Effizienz als auch auf Code-Größe.
  • Zum Erlernen sind verhältnismäßig lange Einarbeitungszeiten erforderlich.
  • Die vorhandene C++-Standardbibliothek deckt viele wichtige Erfordernisse nicht ab, zum Beispiel Threads, TCP/IP, Dateisystem-Verzeichnisse. Deshalb besteht in diesen Bereichen eine begrenzte Portabilität über Betriebssystemgrenzen hinweg.

Der folgende Quelltext stellt ein einfaches C++-Programm dar, das eine Meldung auf dem Standardausgabemedium ausgibt:

#include <iostream>
 
int main()
{
  std::cout << "Hallo Welt!" << std::endl;
}

Erläuterungen:

Bei main handelt es sich um eine Funktion, genauer gesagt ist es die Hauptfunktion des gesamten Programmes. Die Funktion main ist in jedem C++-Programm vorhanden und wird nach dem Start des Programmes aufgerufen.

Die C++-ISO-Norm schreibt vor, dass das Ergebnis von main vom Typ int sein muss. Ein Programm, bei dem das Ergebnis von main nicht vom Typ int ist, ist kein gültiges Programm im Sinne der C++-ISO-Norm (ISO-14882).

Die Funktion main ist die einzige Funktion, die - obwohl sie einen Wert zurückgibt - keine return Anweisung benötigt. Ohne die explizite Anweisung return gibt main den Wert EXIT_SUCCESS (definiert in <cstddef>) zurück.

Verwandtschaft mit C

C++ ist eine Erweiterung der Programmiersprache C gemäß dem Stand von 1990 (ISO/IEC 9899:1990, auch kurz C90 genannt). C++ enthält C nach dem Stand C90 fast vollständig. Einige wenige C-Programme lassen sich zwar nicht ohne Weiteres als C++ kompilieren, beziehungsweise haben als C++-Programme eine etwas andere Bedeutung. Dabei handelt es sich aber um Sonderfälle, die in der Praxis keine große Rolle spielen.

Die Kompatibilität mit C war eines der Hauptdesignziele bei der Entwicklung der Programmiersprache C++. Grund dafür war die weite Verbreitung von C. Da C auch heute noch für praktisch jeden Prozessor verfügbar ist, und daher C die verbreitetste Programmiersprache darstellt, wird Kompatibilität mit C immer noch als eine der wichtigsten Eigenschaften von C++ angesehen.

Im Laufe der Entwicklung der beiden Sprachen gab es auch Rückwirkungen von C++ auf C. Beispielsweise wurden in C const sowie die Funktionsprototypen von C++ übernommen.

Die letzten Änderungen an C fanden 1999 statt (ISO/IEC 9899:1999). Gemäß dem Ratifizierungsjahr 1999 spricht man, wenn man sich auf diesen C-Stand bezieht, deshalb auch von C99. Ein Beispiel für darin eingeführte Spracherweiterungen sind die so genannten VLAs (engl. variable length array).

Vergleich mit anderen Sprachen

Die Programmiersprachen Java und C# haben eine ähnliche Syntax wie C++, sind aber "intern" anders aufgebaut. Java und C# sind praktisch nicht mehr kompatibel mit C.

Ein wesentlicher Unterschied zwischen diesen Sprachen und C++ besteht darin, dass C++ über generische Sprachmerkmale (Templates) verfügt. Es wird zwar bei Java und C# an generischen Spracherweiterungen (s. generischer Typ) gearbeitet (Stand: 2004), die Entwicklung geht dort aber in eine etwas andere Richtung als bei C++.

Gerade die generische Programmierung macht aber C++ zu einem mächtigen Programmierwerkzeug. Während die objektorientierte Programmierung in Java und C# als der Gipfel der vorhandenen Abstraktionsmechanismen angesehen wird, ist diese Art der Programmierung in C++ rückläufig. So werden tiefe Klassenhierarchieen vermieden, und zu Gunsten der Effizienz und der Minimierung des Ressourcenverbrauchs verzichtet man in vielen Fällen auf Polymorphie, dem Kernmechanismus der objektorientierten Programmierung.

Siehe auch: Simula, Objective-C, Smalltalk

C++-Compiler

Compiler Kommentar Plattform
Comeau's C++ Compiler Gilt als der Compiler, der C++ am vollständigsten umsetzt, unterstützt zum Beispiel auch export von Templates; Kommandozeilencompiler; kann über das Internet ausprobiert werden verschiedene Plattformen
g++ Bestandteil von GCC; Kommandozeilencompiler; kann aber auch in integrierten Entwicklungsumgebungen ausgeführt werden, zum Beispiel unter Linux in KDevelop oder Anjuta Unix, Linux, MacOS X, Windows
Intel C++ Ebenfalls ein Compiler, der C++ sehr vollständig umsetzt; erzeugt hocheffizienten Code für Intel-Prozessoren; Kommandozeilencompiler Windows, Linux
Microsoft Visual C++ Verbreitetster Compiler unter Windows; empfohlen ist die Version 7.1 oder neuer, wegen sehr vollständiger Umsetzung der Sprache C++ nach ISO-14882; die Nachfolgeversion Visual C++ 2005 Express ist z.Zt. (2004) kostenlos erhältlich (als Beta-Version) Windows
MinGW "g++ für Windows"; kann sowohl in der Kommandozeile ausgeführt werden als auch in integrierten Entwicklungsumgebungen wie zum Beispiel Dev-C++ Windows
Borland C++ Builder Compiler mit integrierter Entwicklungsumgebung; einfache Erstellung grafischer Oberflächen; kann auch Pascal-Module (Delphi) kompilieren Windows
Open Watcom Compiler und IDE für exotische Platformen. Leider ist die C++-Standardbibliothek noch nicht vollständig dabei. Aber es wird daran gearbeitet. DOS, Windows, OS/2, Netware, (bald auch Linux)

Siehe auch: Kommandozeilen-Compiler, Visuelle Programmierumgebung

Literatur

  • Bjarne Stroustrup: Die C++ Programmiersprache, Addison-Wesley, ISBN 3-8273-1660-X, das Standardwerk zu C++, Grundkenntnisse zu C von Vorteil; sehr empfehlenswert
  • Andrew Koenig / Barbara E. Moo: Intensivkurs C++, Pearson Studium, ISBN 3-8273-7029-9, hervorragendes Anfängerbuch, ein gewisses Grundverständnis zu Programmierung von Vorteil; sehr empfehlenswert
  • Scott Meyers: Effektiv C++ programmieren - 50 Wege zur Verbesserung ihrer Programme und Entwürfe, Addison-Wesley, ISBN 3-8273-1305-8, zur Vertiefung bereits vorhandener C++-Kenntnisse; sehr empfehlenswert
  • Scott Meyers: Mehr Effektiv C++ programmieren - 35 neue Wege zur Verbesserung ihrer Programme und Entwürfe, Addison-Wesley, ISBN 3-8273-1275-2, Vertiefung vorhandener C++-Kenntnisse; sehr empfehlenswert
  • Herb Sutter: Exceptional C++, ISBN 3-8273-1711-8 (deutsch), Vertiefung vorhandener C++-Kenntnisse; sehr empfehlenswert
  • Andrei Alexandrescu: Modernes C++ Design, mitp, ISBN 3-8266-1347-3, das Standardwerk zur C++-Metaprogrammierung, setzt ein tiefes Verständnis von C++ voraus; sehr empfehlenswert
  • Nicolai M. Josuttis: Objektorientiertes Programmieren in C++, Addison-Wesley, ISBN 3-8273-1771-1
  • Stanley B. Lippman, Josee Lajoie: C++ Primer, mitp, ISBN 3-8266-0811-9
  • Peter Prinz, Ulla Kirch-Prinz: C++ Lernen und professionell anwenden, mitp, ISBN 3-8266-0824-0



Weitere Artikel zum Thema C++

tokipona:toki pali Sipupu