Classes
Eine Klasse ist ein benutzerdefinierter Typ.
Ein Klassentyp wird durch einen Klassenspezifizierer definiert, der in der decl-specifier-seq der Deklarations -Syntax 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 nicht zu einer bereits definierten Klasse hinzugefügt werden (im Gegensatz zu den Membern von Namespaces)
Ein Mitglied einer Klasse
T
kann nicht
T
als seinen Namen verwenden, wenn das Mitglied
- ein statisches Datenelement,
- eine Elementfunktion,
- ein Elementtyp,
- eine Elementvorlage,
- ein Enumerator einer Enumeration (sofern die Enumeration nicht scoped ist) (seit C++11) , oder
- ein Element einer anonymen Union.
Allerdings darf ein nicht-statisches Datenelement den Namen
T
verwenden, solange keine benutzerdefinierten Konstruktoren vorhanden sind.
Eine Klasse mit mindestens einer deklarierten oder geerbten
virtual
-Memberfunktion ist
polymorph
. Objekte dieses Typs sind
polymorphe Objekte
und haben Laufzeittypinformationen, die als Teil der Objektrepräsentation gespeichert sind, welche mit
dynamic_cast
und
typeid
abgefragt werden können. Virtuelle Memberfunktionen nehmen an dynamischer 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 constexpr -Konstruktor ist ein LiteralType : Objekte dieses Typs können durch constexpr -Funktionen zur Compilezeit manipuliert werden. |
(seit C++11) |
Inhaltsverzeichnis |
Eigenschaften von Klassen
Trivial kopierbare KlasseEine trivial kopierbare Klasse ist eine Klasse, die
Standard-Layout-KlasseEine Standard-Layout-Klasse ist eine Klasse, die
Eine Standard-Layout-Struktur ist eine Standard-Layout-Klasse, die mit dem Klassen-Schlüsselwort struct oder dem Klassen-Schlüsselwort class definiert ist. Eine Standard-Layout-Union ist eine Standard-Layout-Klasse, die mit dem Klassen-Schlüsselwort union definiert ist. |
(seit C++11) |
Implizite-Lebensdauer-Klasse
Eine implicit-lifetime-Klasse ist eine Klasse, die
- ist ein Aggregat , dessen Destruktor nicht benutzerdeklariert (bis C++11) benutzerbereitgestellt (seit C++11) ist, oder
- mindestens einen trivialen geeigneten Konstruktor und einen trivialen, nicht gelöschten Destruktor besitzt.
Hinweis: Die implizite-Lebensdauer-Eigenschaft wird durch den Fehlerbericht P0593R6 geklärt.
POD-KlasseEine POD-Klasse ist eine Klasse, die
Eine POD-Struktur ist eine Nicht-Union-POD-Klasse. Eine POD-Union ist eine Union, die eine POD-Klasse ist. |
(veraltet in C++20) |
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 148 | C++98 |
POD-Klassen konnten keine Zeiger auf Member enthalten,
die selbst POD- (skalare) Typen sind |
Einschränkung entfernt |
| CWG 383 | C++98 |
Kopierzuweisungsoperatoren oder Destruktoren konnten
in POD-Klassen benutzerdeklariert werden, wenn sie nicht definiert sind |
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 besitzt,
die alle als gelöscht definiert sind, könnte trivial sein |
sie ist nicht-trivial |
| CWG 1672 | C++11 |
eine Klasse könnte 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-/Move-Konstruktoren/Zuweisungsoperatoren haben |
kann trivial sein wenn gelöscht |
| CWG 1813 | C++11 |
eine Klasse war niemals eine Standard-Layout-Klasse wenn sie eine
Basisklasse hat, die eine nicht-statische Datenelement erbt |
sie kann eine Standard-Layout-Klasse sein |
| CWG 1881 | C++11 |
für eine Standard-Layout-Klasse und ihre Basisklassen,
könnten unbenannte Bitfelder in einer anderen Klasse deklariert werden, die die Datenelemente deklariert |
alle nicht-statischen Datenelemente
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 |
behandelte diesen Fall in
der Definition von M(X) |
| CWG 2605 | C++98 | eine implizite-Lebensdauer-Klasse könnte einen benutzerbereitgestellten Destruktor haben | verboten |