Namespaces
Variants

Classes

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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:

1) Datenelemente:
2) Memberfunktionen:
3) geschachtelte Typen:
a) nested classes und enumerations die innerhalb der Klassendefinition definiert sind
b) Aliase bestehender Typen, definiert mit typedef oder Typ-Alias (seit C++11) Deklarationen
c) der Name der Klasse innerhalb ihrer eigenen Definition fungiert als öffentlicher Mitgliedstypalias von sich selbst zum Zweck der Suche (außer wenn er zur Benennung eines Konstruktors verwendet wird): dies ist bekannt als injected-class-name
4) enumerators aus allen unbegrenzten Enumerationen, die innerhalb der Klasse definiert sind , oder durch using-declarations oder using-enum-declarations eingeführt wurden (seit C++20)
5) Member-Templates ( Variable-Templates, (seit C++14) Klassen-Templates oder Funktions-Templates) können im Rumpf jeder nicht-lokalen Klasse/Struktur/Union erscheinen.

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 Klasse

Eine trivial kopierbare Klasse ist eine Klasse, die

Triviale Klasse

Eine triviale Klasse ist eine Klasse, die

(in C++26 veraltet)

Standard-Layout-Klasse

Eine Standard-Layout-Klasse ist eine Klasse, die

  • keine nicht-statischen Datenelemente vom Typ einer Nicht-Standard-Layout-Klasse (oder Array solcher Typen) oder Referenz besitzt,
  • keine virtuellen Funktionen und keine virtuellen Basisklassen besitzt,
  • für alle nicht-statischen Datenelemente dieselbe Zugriffssteuerung hat,
  • keine Nicht-Standard-Layout-Basisklassen besitzt,
  • nur eine Klasse in der Hierarchie nicht-statische Datenelemente besitzt, und
  • informell: keine der Basisklassen denselben Typ wie das erste nicht-statische Datenelement hat. Oder formal: gegeben die Klasse als S, hat kein Element der Menge M(S) von Typen als Basisklasse, wobei M(X) für einen Typ X definiert ist als:
  • Wenn X ein Nicht-Union-Klassentyp ohne (möglicherweise geerbte) nicht-statische Datenelemente ist, ist die Menge M(X) leer.
  • Wenn X ein Nicht-Union-Klassentyp ist, dessen erstes nicht-statisches Datenelement den Typ X0 hat (wobei dieses Element eine anonyme Union sein kann), besteht die Menge M(X) aus X0 und den Elementen von M(X0).
  • Wenn X ein Union-Typ ist, ist die Menge M(X) die Vereinigung aller M(Ui) und der Menge aller Ui, wobei jedes Ui der Typ des i-ten nicht-statischen Datenelements von X ist.
  • Wenn X ein Array-Typ mit Elementtyp Xe ist, besteht die Menge M(X) aus Xe und den Elementen von M(Xe).
  • Wenn X ein Nicht-Klassen-, Nicht-Array-Typ ist, ist die Menge M(X) leer.

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-Klasse

Eine POD-Klasse ist eine Klasse, die

  • ein Aggregat ist,
  • keinen benutzerdefinierten Kopierzuweisungsoperator hat,
  • keinen benutzerdefinierten Destruktor hat und
  • keine nicht-statischen Datenelemente vom Typ Nicht-POD-Klasse (oder Array solcher Typen) oder Referenz hat.
(bis C++11)
  • eine triviale Klasse ist,
  • eine Standard-Layout-Klasse ist und
  • keine nicht-statischen Datenelemente vom Typ Nicht-POD-Klasse (oder Array solcher Typen) hat.
(seit C++11)

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