Klassen
Eine Klasse ist ein benutzerdefinierter Typ.
Ein Klassentyp wird durch einen Klassenspezifizierer definiert, der in der decl-specifier-seq der Deklarationssyntax erscheint. Siehe Klassendeklaration für die Syntax des Klassenspezifizierers.
Eine Klasse kann die folgenden Arten von Membern haben:
Alle Member werden gleichzeitig in der Klassendefinition definiert, sie können einer bereits definierten Klasse nicht hinzugefügt werden (im Gegensatz zu den Membern von Namespaces).
Ein Member einer Klasse T kann T nicht als seinen Namen verwenden, wenn der Member
- ein statischer Datenmember ist,
- eine Memberfunktion ist,
- ein Membertyp ist,
- ein Member-Template ist,
- ein Aufzählungsbestandteil einer Aufzählung ist (es sei denn, die Aufzählung ist geschachtelt)(seit C++11), oder
- ein Member einer anonymen Member-Union ist.
Ein nicht-statischer Datenmember darf jedoch den Namen T verwenden, solange keine benutzerdefinierten Konstruktoren vorhanden sind.
Eine Klasse mit mindestens einer deklarierten oder geerbten virtuellen Memberfunktion ist *polymorph*. Objekte dieses Typs sind *polymorphe Objekte* und haben zur Laufzeit Typinformationen, die als Teil der Objektbeschreibung gespeichert sind und mit dynamic_cast und typeid abgefragt werden können. Virtuelle Memberfunktionen nehmen an der dynamischen Bindung teil.
Eine Klasse mit mindestens einer deklarierten oder geerbten rein virtuellen Memberfunktion ist eine abstrakte Klasse. Objekte dieses Typs können nicht erstellt werden.
|
Eine Klasse mit einem |
(seit C++11) |
Inhalt |
[bearbeiten] Eigenschaften von Klassen
Trivially Copyable ClassEine *trivially copyable class* ist eine Klasse, die
Standard-Layout-KlasseEine *Standard-Layout-Klasse* ist eine Klasse, die
Ein *Standard-Layout-Struct* ist eine Standard-Layout-Klasse, die mit dem Schlüsselwort struct oder dem Schlüsselwort class definiert wurde. Ein *Standard-Layout-Union* ist eine Standard-Layout-Klasse, die mit dem Schlüsselwort union definiert wurde. |
(seit C++11) |
[bearbeiten] Implizit-Lebenszeit-Klasse
Eine *implizit-lebenszeit-Klasse* ist eine Klasse, die
- eine aggregierte Klasse ist, deren Destruktor nicht benutzerdefiniert(bis C++11)benutzerbereitgestellt(seit C++11) ist, oder
- mindestens einen trivialen berechtigten Konstruktor und einen trivialen, nicht gelöschten Destruktor hat.
Hinweise: Die Eigenschaft "implizit-lebenszeit" wird durch den Fehlerbericht P0593R6 klargestellt.
[bearbeiten] POD-KlasseEine *POD-Klasse* ist eine Klasse, die
Ein *POD-Struct* ist eine Nicht-Union-POD-Klasse. Ein *POD-Union* ist ein Union, das eine POD-Klasse ist. |
(veraltet in C++20) |
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 148 | C++98 | POD-Klassen konnten keine Zeiger auf Member enthalten, die selbst POD- (skalare) Typen sind. |
Beschränkung aufgehoben |
| CWG 383 | C++98 | Kopierzuweisungsoperatoren oder Destruktoren konnten in POD-Klassen benutzerdefiniert sein, wenn sie nicht definiert waren. |
nicht erlaubt |
| CWG 1363 | C++11 | Eine Klasse, die gleichzeitig triviale Standardkonstruktoren und nicht-triviale Standardkonstruktoren hat, könnte trivial sein. |
sie ist nicht-trivial |
| CWG 1496 | C++11 | Eine Klasse, die nur Konstruktoren hat, die alle als gelöscht definiert sind, könnte trivial sein. |
sie ist nicht-trivial |
| CWG 1672 | C++11 | Eine Klasse konnte eine Standard-Layout-Klasse sein, wenn sie mehrere leere Basisklassen hat. |
sie ist keine Standard-Layout-Klasse |
| CWG 1734 | C++11 | Eine trivial kopierbare Klasse konnte keine nicht-trivialen gelöschten Kopier-/Verschiebungskonstruktoren/Zuweisungsoperatoren haben. |
kann trivial sein, wenn gelöscht |
| CWG 1813 | C++11 | Eine Klasse war nie eine Standard-Layout-Klasse, wenn sie eine Basisklasse hat, die einen nicht-statischen Datenmember erbt. |
sie kann eine Standard-Layout-Klasse sein |
| CWG 1881 | C++11 | Für eine Standard-Layout-Klasse und ihre Basisklassen konnten unbenannte Bitfelder in einer anderen Klasse deklariert werden, die die Datenmember deklariert. |
alle nicht-statischen Datenmember und Bitfelder müssen zuerst in derselben Klasse deklariert werden. |
| CWG 1909 | C++98 | Ein Member-Template konnte denselben Namen wie seine Klasse haben. | verboten |
| CWG 2120 | C++11 | Die Definition von M(X) bei der Bestimmung einer Standard- Layout-Klasse berücksichtigte nicht den Fall einer Klasse, deren erstes Element ein Array ist. |
adressiert diesen Fall in der Definition von M(X). |
| CWG 2605 | C++98 | Eine implizit-lebenszeit-Klasse konnte einen benutzergestellten Destruktor haben. | verboten |