Klassendefinitionen in C++
Das folgende Programm zeigt die Definition einer Klasse »::entity«.
main.cpp
#include <iostream>
#include <ostream>struct entity {};
int main() {}
::std::cout
(keine Ausgabe)
Die Klassendefinition in dem obigen Programm ist »struct entity {};«.
- Eine Klassendefinition
struct entity {};
Die im Programm definierte Klasse »::entity« kann ähnlich verwendet werden wie eine von der Bibliothek definierte Klasse. Im weiteren Verlauf dieses Kurses folgen noch Beispiele dafür.
Der Klassenname
Der Klassenname kann vom Programmierer festgelegt werden und unterliegt in etwa denselben Regeln wie ein Variablenname. In dem obigen Programmbeispiel wurde als Name »entity« gewählt.
Syntax einer Klassendefinition
Der Klassenspezifizierer
Die Klassendefinition »struct entity {};« wird in der Form eines Klassenspezifizierers »struct entity {}« geschrieben, dem ein Semikolon »;« folgt.
Die vereinfachte Syntax für einen Klassenspezifizierer lautet:
- {$upa~〈}class-specifier {$upa~〉 ::=}
- 'struct' 〈class-name 〉
- '{' '}'.
Der Teil vor der ersten geschweiften Klammer, wie »struct entity«, wird auch 〈class-head 〉 (Klassenkopf ) genannt. Der Rest hinter dem Klassenkopf kann auch Klassenrumpf genannt werden.
- C++ 2015, 9
- A class-specifier is commonly referred to as a class definition. A class is considered defined after the closing brace of its class-specifier has been seen
Das Semikolon
Das Semikolon dient dazu, aus dem 〈class-specifier 〉 eine 〈declaration 〉 zu machen, denn ein Programm (technisch gesagt: eine 〈translation-unit 〉) muß letztendlich eine Folge von Deklarationen sein.
- 〈declaration 〉 ::= 〈class-specifier 〉 ';'.
Hinter dem Klassenspezifizierer könnte noch eine 〈init-declarator-list 〉 folgen, und das Semikolon »;« ist daher nötig, um die Deklaration abzuschließen, damit dem 〈class-specifier 〉 Folgendes nicht als 〈init-declarator-list 〉 interpretiert wird.
Ein Funktionsdefinition endet mit einen 〈compound-statement 〉 und ist bereits alleine eine 〈declaration 〉, so daß hinter ihr kein Semikolon folgt.
Aufbau einer Übersetzungseinheit *
Die folgenden Produktionsregeln zeigen den Aufbau einer Übersetzungseinheit 〈translation-unit 〉 bis hin zur Klassendefinition und begründen damit auch noch einmal das Semikolon.
- 〈translation-unit 〉 ::= [〈declaration-seq 〉].
- 〈declaration-seq 〉 ::= 〈declaration-seq 〉 〈declaration 〉 | 〈declaration-seq 〉.
- 〈declaration 〉 ::= 〈block-declaration 〉.
- 〈block-declaration 〉 ::= 〈simple-declaration 〉.
- 〈simple-declaration 〉 ::= [〈decl-specifier-seq 〉] [〈init-declarator-list 〉] ';'.
- 〈decl-specifier-seq 〉 ::= 〈decl-specifier 〉 [〈attribute-specifier-seq 〉] | 〈decl-specifier 〉 〈decl-specifier-seq 〉.
- 〈decl-specifier 〉 ::= 〈type-specifier 〉.
- 〈type-specifier 〉 ::= 〈class-specifier 〉.
Die Größe eines Exemplars
Ein Exemplar einer Klasse, die mit leeren geschweiften Klammern spezifiziert wurde, ist leer und sollte die Größe 0 haben. Da die Größe eines Exemplars einer Klasse aber in einem Fall wie in dem folgenden Programm immer mindestens 1 sein muß, ist sie 1.
main.cpp
#include <iostream>
#include <ostream>struct entity {};
int main(){ ::std::cout << sizeof( ::entity )<< '\n'; }
::std::cout
1
Der Namensraum
Eine außerhalb von Klammern deklarierte Klasse befindet sich im globalen Namensraum, wie in dem folgenden Beispielprogramm durch den unären Bereichsoperator verdeutlicht wird.
main.cpp
#include <iostream>
#include <ostream>struct entity {};
int main(){ ::std::cout << sizeof( ::entity )<< '\n'; }
::std::cout
1
Der Deklarationspunkt *
Ein Deklarationspunkt ist die Stelle eines Programms, ab der ein Name einer Deklaration gültig ist. (Es handelt sich um eine Stelle im Quelltext. Damit ist nicht das Zeichen ».« gemeint.)
Der Deklarationspunkt befindet sich in »struct entity {};« direkt hinter dem Klassennamen »entity«.
Übungsaufgaben
/ Definieren einer neuen Klasse
Definieren Sie eine Klasse »example« und verwenden Sie dann sizeof, um die Größe eines Objektes jener Klasse auszugeben.