Skip to main content

Die Sprache C++

  • Chapter
  • First Online:
Moderne C++ Programmierung

Part of the book series: Xpert.press ((XPERT.PRESS))

  • 15k Accesses

Zusammenfassung

C++ ist inzwischen eine relativ alte Programmiersprache, die viele Brüche in ihrer Geschichte erlebt hat. Vieles, was man heute in C++ findet, ist älteren Programmiermethoden und Ideen zu verdanken, die heute nicht mehr unbedingt aktuell sind. Modernere objektorientierte Sprachen, wie zum Beispiel JAVA, sind in ihrer syntaktischen Struktur weit weniger komplex, da sie weniger unterschiedlichen Paradigmen folgen müssen. In den folgenden Abschnitten soll ein Überblick über die verschiedenen Phasen der Entwicklung von C++ gegeben werden. Damit sollen auch die unterschiedlichen Ideen umrissen werden, die bis heute in der Sprache C++ stecken, ihre Grundlage bilden und sie einerseits mächtig und andererseits an manchen Stellen auch unübersichtlich machen. Für den C++-Entwickler stellt sich immer die schwierige Frage der Auswahl geeigneter Methoden für seine aktuelle Arbeit. Dabei muss zwischen konkurrierenden Leitideen ausgewählt werden und es müssen solche verworfen werden, die nicht mehr aktuell sind.

This is a preview of subscription content, log in via an institution to check access.

Access this chapter

Chapter
USD 29.95
Price excludes VAT (USA)
  • Available as PDF
  • Read on any device
  • Instant download
  • Own it forever
eBook
USD 59.99
Price excludes VAT (USA)
  • Available as EPUB and PDF
  • Read on any device
  • Instant download
  • Own it forever
Hardcover Book
USD 74.99
Price excludes VAT (USA)
  • Durable hardcover edition
  • Dispatched in 3 to 5 business days
  • Free shipping worldwide - see info

Tax calculation will be finalised at checkout

Purchases are for personal use only

Institutional subscriptions

Notes

  1. 1.

    Paradigma: Leitidee.

  2. 2.

    Siehe Abschn. 

  3. 3.

    Der Autor der STL, Alexander Stephanov, wurde durch Hewlett Packard und SGI für deren Entwicklung unterstützt. Über Server bei HP stand die STL schon 1994 zum Download bereit.

  4. 4.

    Es ist im ANSI/ISO-Standard zwar ein Migrationspfad für die alte Anwendung des new-Operators vorgesehen – die „nothrow“-Variante –, jedoch ist eine Portierung alten AT&T-konformen Codes deutlich aufwändiger als die reine Anpassung der Verwendungen des Operators new.

  5. 5.

    Ein prominentes Beispiel dafür ist sicher die MFC.

  6. 6.

    Das war in älteren C++-Dialekten einmal anders.Dort galten 32 oder 256 Stellen im Bezeichner als signifikant. Alles was darüber hinausging wurde einfach abgeschnitten. Auch heute sind noch solche Compiler im breiten Einsatz, die nach diesem alten Verfahren arbeiten.Natürlich gelten auch bei Compilern, die dem ANSI/ISO-Standard entsprechen, technische Grenzen. Ein Bezeichner sollte also nicht den ganzen Hauptspeicher füllen.

  7. 7.

    In den meisten Fällen ist der Präprozessor ein eigenes Tool, das durch den Compiler selbst aufgerufen wird. Daher kann man einen solchen Präprozessorlauf auch ohne einen ganzen Compilerlauf anstoßen, um die Ergebnisse bestimmter Präprozessordirektiven zu überprüfen.

  8. 8.

    Das ist im Prinzip eine normale Quellcodedatei. Allerdings enthält sie für gewöhnlich nur bestimmte Definitionen. In folgenden Abschnitten wird näher darauf eingegangen werden.

  9. 9.

    Die hier gezeigten bedingten Codefragmente extern "C" mit den dazugehörigen geschweiften Klammern werden für die Integration von C- und C++-Code gebraucht.

  10. 10.

    So etwas kann zwar auch mit C++ erreicht werden. Dazu muss allerdings erst das Klassenkonzept verstanden werden. Deshalb stelle ich mich zunächst auf den Standpunkt, dass es variante Datentypen in C++ nicht gibt.

  11. 11.

    In C müssen sie immer am Anfang eines Blocks vor den Anweisungen stehen.

  12. 12.

    „üblicherweise“ deshalb, da im Standard keine feste Breite definiert ist. Es ist lediglich folgendes definiert: sizeof(char) \(\le\) sizeof(short) \(\le\) sizeof(int) \(\le\) sizeof(long). Alle ganzzahligen Datentypen sind also plattformabhängig. Zum Vergleich dazu: 5 Abschnitte 3.9.1.x [basic.fundamental]

  13. 13.

    Ich kenne noch keine Ausnahme.

  14. 14.

    Auf 16-Bit Maschinen ist sizeof(int) üblicherweise 2, bei 32-Bit Maschinen ist es 4.

  15. 15.

    Auch dazu kenne ich noch keine Ausnahme.

  16. 16.

    Wie z. B. bei 64-Bit Linux oder 64-Bit MacOS X.

  17. 17.

    Im praktischen Einsatz von C++ zeigt es sich immer wieder, dass Entwickler zur „Verschönerung“ mancher Zahlen im Quelltext eine Null voranstellen möchten ohne dabei zu bedenken, dass sich damit der numerische Wert der Zahl ändert.

  18. 18.

    Siehe Abschn. .

  19. 19.

    Siehe Abschn. .

  20. 20.

    Auch wenn der deutsche Begriff „Stapel“ gebraucht werden kann, verwende ich lieber den englischen Begriff „Stack“, da er sich in der Praxis durchgesetzt hat.

  21. 21.

    In Englisch „Pointer“.

  22. 22.

    Da der Datentyp int systemabhängig ist, kann er auch – auf 16-Bit-Systemen – zwei Bytes umfassen. In seltenen Fällen – auf manchen 64-Bit-Systemen – ist er 8 Bytes groß.

  23. 23.

    Diese Sicht stellt zwar eine Vereinfachung dar, kann aber für die Applikationsentwicklung so stehen gelassen werden. Aus der Sicht des Betriebssystems stellt sich die Sache unter Umständen etwas anders dar. Wenn das System eine virtuelle Speicherverwaltung besitzt, wird zwischen physikalischem und virtuellem Speicher unterschieden. In einem Prozess kann durchaus ein Adresswert vergeben werden, der dem eines anderen Prozesses gleicht. Die Prozesse sind in diesem Fall aber voneinander abgeschirmt.

  24. 24.

    Der freie Speicher, der dynamisch allokiert werden kann.

  25. 25.

    Das Verweisen auf den Speicherbereich erschöpft sich dabei auf das Enthalten der Adresse. Ungefähr so, wie eine Visitenkarte auf eine reale Adresse einer Person verweist. Es ist zunächst kein Vorgang damit verknüpft.

  26. 26.

    Siehe auch Abschn.  und Abschn.  zu diesem Thema.

  27. 27.

    C++ ISO Standard 14882 Kapitel 5 Absatz 2.

  28. 28.

    Das kann auch wieder ein Adresswert sein. In diesem Fall bestimmt der L-Wert eine Speicherstelle, in die ein Adresswert passt.

  29. 29.

    Siehe Abschn. .

  30. 30.

    Von Initialisierungsanweisungen auf dem globalen Scope einmal abgesehen.

  31. 31.

    Diese Regel gilt für C++. In C gibt es dazu einige Abweichungen, die aber hier nicht näher erörtert werden sollen.

  32. 32.

    Im Englischen nennt man die Typenkonvertierung „Typecast“ oder verkürzt einfach „Cast“. In einigen Abschnitten des Buchs wird die englische Benennung verwendet.

  33. 33.

    Das Caching ist bei modernen Prozessoren eine Technik, die die Geschwindigkeit der Ausführung steigert. Ist der Code groß, ist das Caching aufwändiger.

  34. 34.

    Die Größe eines Compilats nennt man auch „footprint“.

  35. 35.

    Es ist dringend ratsam, den Code in solcher Weise lesbar zu halten. Wenn man Code warten möchte, hat man mit der genannten Formulierung einen Hinweis darauf, dass es sich um 1000 long-Speicherstellen handeln soll.

  36. 36.

    Wenn eine MMU vorhanden ist, nennt sich deren Speicherbereich, in dem sich die Umsetzungstabellen für die Adressen befinden, der Translation Lookaside Buffer.

  37. 37.

    Man stelle sich den Extremfall vor, in dem jeder Block der Größe 1 in einer Tabelle aufgeführt werden würde mit einer entsprechenden virtuellen Adresse. In diesem Fall würde die Tabelle ein Vielfaches des verwalteten Speichers benötigen.

  38. 38.

    Also 4KB oder 8KB. Grundsätzlich können es auch Vielfache davon sein.

  39. 39.

    QNX 6.x ist ein solches Betriebssystem, das die verbliebene Fragmentierung auf Seitenebene mit Hilfe eines an den Blockgrößen in Zweierpotenzen ausgerichteten Poolingverfahrens reduziert.

  40. 40.

    bzw. der Prozedur.

  41. 41.

    Dieser Gedanke vereinfacht etwas, denn es gibt in C – und nicht nur dort – noch andere Möglichkeiten der Definition eigener Datentypen. So gibt es die Unions und die Enumerationstypen.

  42. 42.

    Also 2, 4, 6 oder 8 Bytes. Je nach Systemplattform.

  43. 43.

    Konsequenterweise ist die Struktur in C++ eine Klasse mit unwesentlich veränderter Syntax.

  44. 44.

    Siehe Abschn. .

  45. 45.

    Siehe Abschn. .

  46. 46.

    Siehe Abschn. .

  47. 47.

    Im Gegensatz zur Referenzübergabe von Parametern.

  48. 48.

    Ein Handle beispielsweise. Ein Objekt könnte ein Handle enthalten, das meinetwegen auf eine Datei verweist.

  49. 49.

    Siehe Abschn. .

  50. 50.

    Sogar vor und nach der Ausführung von main().

  51. 51.

    Die erste Pipe-Struktur der Intel-Prozessoren wurde mit dem 486er eingeführt. Mit dem Pentium wurde das Verfahren perfektioniert, sodass der eigentliche Geschwindigkeitssprung durch diese neue Technik erreicht wurde.

  52. 52.

    Symbole sind die Elemente, die der Linker in seinen Objektdateien finden kann. Diese Symbole haben Namen, die aus den Bezeichnern in C und C++ gebildet sind. Das „Namemangling“ unterscheidet sich dabei in den beiden Sprachen. Nicht jeder Bezeichner führt gleich zu einem Symbol in der Objektdatei. Voraussetzung dafür ist, dass das bezeichnete Element Speicher benötigt. Es sind also Funktionen, Methoden und globale Daten.

  53. 53.

    Siehe Abschn. .

  54. 54.

    Es gibt sogar Betriebssysteme, wie zum Beispiel QNX, die für konstante und variable Speicherinhalte unterschiedliche Segmente definieren.

  55. 55.

    Siehe Abschn. .

  56. 56.

    Davon müssen mit #define definierte Funktionsmakros ausgenommen werden, denn der Präprozessorlauf kennt nur die Syntax der Präprozessoranweisungen. Für ihn sind Scopes nicht existent.

  57. 57.

    Ein Beispiel für eine solche Ausnahme wird mit dem Barton-Nackman-Trick in Abschn.  beschrieben, ein weiteres als kleines Detail in Abschn.  im Listing .

  58. 58.

    Strukturen werden in C++ generell wie Klassen behandelt.

  59. 59.

    Diese Denkweise herrschte noch Ende der 80er und Anfang der 90er Jahre bei der Mehrheit der Programmierer vor, die OO-Programmierung betrieben.

  60. 60.

    In der Linguistik auch Hyperonymbeziehung genannt.

  61. 61.

    Der Vererbungsbegriff stammt natürlich aus der Biologie. Trotzdem sollte man nicht allzu lange über die biologische Vererbung meditieren, um das Wesen der Klassenvererbung in der Objektorientierten Programmierung zu verstehen. Die Biologie wurde im 20sten Jahrhundert eine sehr erfolgreiche Wissenschaft. Mancher spricht auch davon, dass die Biologie die Physik als „Leitwissenschaft“ abgelöst hätte. Das heißt, dass sie seit dem 20sten Jahrhundert prototypische Denkstrukturen auch für ganz andere Bereiche zur Verfügung stellt. Aufgrund ihres Erfolges wurden diese Denkweisen auch gerne von dieser neuen strahlenden Wissenschaft in ganz andere Zusammenhänge übernommen. Manchmal waren es auch weniger die kompletten Gedanken, als vielmehr die Begriffe. Der Begriff der Vererbung ist in der Objektorientierung also nur dem Wort nach mit dem in der Biologie identisch. Das, was das Wort „Vererbung“ bezeichnet, ist in diesen Bereichen etwas völlig Unterschiedliches.

  62. 62.

    Hat schon jemand das reine Säugetier gesehen?

  63. 63.

    Bekannte und verbreitete Frameworks zur GUI-Programmierung verfolgen exakt diesen Ansatz. So gibt es in der schon betagten MFC einen „Device Context“, der einen solchen Zeichenhintergrund darstellt. In den Java-Frameworks zur Fensterprogrammierung heißt das entsprechende Element „Graphics“.

  64. 64.

    Die Null hat in diesem Zusammenhang keine numerische Bedeutung.

  65. 65.

    Da es für gewöhnlich keinen Sinn ergibt, eine virtuelle Methode für die Basisklasse zu definieren, brachte diese Kennzeichnungsmöglichkeit ab der AT&T-Version 2.0 einen enormen Vorteil. Vorher mussten diese Funktionen auch definiert werden.

  66. 66.

    „Dynamisch“ deshalb, da dieser Polymorphismus zur Laufzeit aufgelöst wird. Mit dem statischen Polymorphismus spricht man nur die Möglichkeit zur Funktionsüberladung an, die zur Compilezeit gelöst wird.

  67. 67.

    Man bedenke, dass die Anwendung des Schlüsselworts const nicht einfach nur kosmetischer Natur ist. Es wird vom Compiler zur Unterscheidung der Methodensignaturen herangezogen. Ein Objekt kann beispielsweise in einem nicht veränderbaren Speicherbereich liegen. Manche Betriebssysteme legen konstante Objekte in einem dafür ausgewiesenen Speicherbereich an und überprüfen die Zugriffe. Ein Schreibzugriff auf ein solches Objekt würde das Beenden des Prozesses bedeuten.

  68. 68.

    engl.: virtual method table oder einfach vtable.

  69. 69.

    Downcast: Konvertierung in die Richtung der Kindklasse. Die Konvertierung in Richtung der Elternklasse nennt man Upcast.

  70. 70.

    Sogar ein Upcast eines Kindklassenzeigers auf den Elterklassentyp schlägt fehl, wenn die Vererbung privat oder geschützt ist.

  71. 71.

    Java besitzt eine alternative Technik: die Mehrfachimplementierung von Interfaces. Diese ist viel besser gegen falsche Anwendung gewappnet als die Mehrfachvererbung von Klassen.

  72. 72.

    Man nennt das Ableiten von einer Klasse, die Implementierung enthält, auch „Implementierungsvererbung“.

  73. 73.

    Ein Grund mehr, warum man Adresswerte nie zur Bildung von IDs heranziehen sollte.

  74. 74.

    Unter bestimmten Umständen wird diese Funktionsschreibweise der Operatorschreibweise bevorzugt. Insbesondere dann, wenn in der Templateprogrammierung die Notwendigkeit zur Qualifizierung des Operators gegeben ist. Siehe Abschn. .

  75. 75.

    Im Fall des überladenen Shiftoperators << für den Ausgabestrom handelt es sich um einen semantisch umdefinierten Operator.

  76. 76.

    Es ist sogar empfehlenswert immer einen solchen zu deklarieren und wenn nötig auch zu implementieren, da der Standard-Zuweisungsoperator in vielen Fällen zu Fehlern führen kann, wenn man ihn einfach vergisst.

  77. 77.

    Siehe Abschn. .

  78. 78.

    Und sei es nur, um das Exception Handling so gut es geht zu deaktivieren oder zu umgehen.

  79. 79.

    Nicht zuletzt deshalb, weil C kein Exception Handling kennt.

  80. 80.

    Also kein std::string!

  81. 81.

    Wie zum Beispiel der Borland C++ 5.x-Compiler für Windows.

  82. 82.

    Der Metrowerks C++ 3.0 für Windows und Mac/PowerPC.

  83. 83.

    Der GNU gcc 3.4.4. Getestet wurde von mir die Variante cygwin special unter Windows.

Author information

Authors and Affiliations

Authors

Corresponding author

Correspondence to Ralf Schneeweiß .

Rights and permissions

Reprints and permissions

Copyright information

© 2012 Springer-Verlag Berlin Heidelberg

About this chapter

Cite this chapter

Schneeweiß, R. (2012). Die Sprache C++. In: Moderne C++ Programmierung. Xpert.press. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-642-21429-5_2

Download citation

Publish with us

Policies and ethics