C++

objektorientierte Programmiersprache
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 14. Dezember 2004 um 14:10 Uhr durch Ocrho (Diskussion | Beiträge) (Verbesserung des Titelhinweises: Exakt statt korrekt + WikiLink auf technische Einschränkung). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Der exakte Titel lautet: C++. Aufgrund einer technischen Einschränkung lautet der Titel ohne Pluszeichen.



C++ ist eine 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 ab 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 die Programmiersprache 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 Standard Template Library (STL) hinzu.

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

2003 wurde die erste überarbeitete Version von ISO/IEC 14882:1998 verabschiedet (ISO/IEC 14882:2003). Diese Revision (Liste der Änderungen) ist lediglich eine Nachbesserung der Norm ISO/IEC 14882:1998 und sollte nicht mit der in Arbeit befindlichen Version verwechselt werden. Die nächste Version der Sprache C++ erscheint voraussichtlich noch in dieser Dekade. (s. in der Entwicklung befindliche Version)

Merkmale

C++ unterstützt die folgenden Programmiertechniken:

C++ ist somit eine so genannte "Multiparadigmen-Sprache", die dem Programmierer sehr viele Freiheiten lässt. (Siehe Stärken und Schwächen)

Siehe auch: Programmierparadigma, Entwurfsmuster, RAII

Allgemeine Bewertung

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 teilweise unnötig schwer verständliche C-Syntax.
  • 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 Geschwindigkeit 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 eingeschränkte 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 0 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).

Aufgrund dieser Weiterentwicklung von C gibt es theoretisch mehr Inkompatibilitäten zwischen C und C++. Da es aber nicht viele C-Compiler gibt, die C99 unterstützen, hat dies keine große praktische Bedeutung. Bei der in Arbeit befindlichen C++-Version wird u.a. daran gearbeitet, die neuen C99-Merkmale miteinzuarbeiten. Einige C++-Compiler unterstützen C99-Neuerungen schon jetzt (z.B. gcc).

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 existiert zwar in Java eine generischen Spracherweiterung und bei C# wird an ebensolcher (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, Eiffel (Programmiersprache)

In der Entwicklung befindliche Version

C++0x (manchmal auch C++200x) ist eine inoffizielle Abkürzung für die in der Entwicklung befindliche Version der Programmiersprache C++.

Zwar scheint der Name anzudeuten, dass dieser Standard bis spätestens 2009 fertig gestellt wird, dies ist jedoch nicht wirklich der Fall. Es handelt sich lediglich um eine grobe Einschätzung des möglichen Erscheinungstermins.

C++-Compiler

Compiler Kommentar Plattform
Comeau's C++ Compiler Gilt als der Compiler, der C++ vollständig umsetzt; unterstützt zum Beispiel auch export von Templates; Kommandozeilencompiler; kann über das Internet ausprobiert werden verschiedene Plattformen
Intel C++ Ebenfalls ein Compiler, der C++ nahezu 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 nahezu vollständiger Umsetzung der Sprache C++; die Nachfolgeversion Visual C++ 2005 Express ist z.Zt. (2004) kostenlos erhältlich (als Beta-Version) Windows
g++ Bestandteil von GCC; Kommandozeilencompiler; kann aber auch in integrierten Entwicklungsumgebungen ausgeführt werden, zum Beispiel unter Linux in KDevelop oder Anjuta Unix, Linux, Mac OS X, 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 Grafisches Entwicklungswerkzeug zur einfachen und schnellen Anwendungsentwicklung; integrierte Entwicklungsumgebung; kann auch Pascal-Module (Delphi) kompilieren und debuggen; Weiterentwicklung nicht sichergestellt (Stand: September 2004) Windows
Open Watcom Compiler und IDE für exotische Platformen. Die C++-Standardbibliothek ist 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 - Generische Programmierung und Entwurfsmuster angewendet, 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

Siehe auch

tokipona:toki pali Sipupu