Regeln zum Deklarieren von Konstruktoren
Ein Konstruktor hat den gleichen Namen wie seine Klasse. Eine beliebige Anzahl von Konstruktoren kann abhängig von den Regeln der überladenen Funktionen deklariert werden. (Weitere Informationen finden Sie unter Überladung.)
class-name ( argument-declaration-list )
Hinweise
argument-declaration-list kann leer sein.
C++ definiert zwei spezielle Arten von Konstruktoren, Standard- und Kopierkonstruktoren, die in der folgenden Tabelle beschrieben werden.
Standard- und Kopierkonstruktoren
Art der Konstruktion |
Argumente |
Zweck |
---|---|---|
Standardkonstruktor |
Kann ohne Argumente aufgerufen werden |
Erstellen eines Standardobjekttyps des Klassentyps |
Kopierkonstruktor |
Kann ein einzelnes Argument des Verweises auf den gleichen Klassentyp akzeptieren |
Kopieren von Objekten des Klassentyps |
Standardkonstruktoren können ohne Argumente aufgerufen werden. Sie können jedoch einen Standardkonstruktor mit einer Argumentliste deklarieren, sofern alle Argumente über Standardwerte verfügen. Ebenso müssen Kopierkonstruktoren ein einzelnes Argument des Verweises auf denselben Klassentyp akzeptieren. Weitere Argumente können bereitgestellt werden, wenn alle nachfolgenden Argumente über Standardwerte verfügen.
Wenn Sie keine Konstruktoren angeben, versucht der Compiler, einen Standardkonstruktor zu generieren. Wenn Sie keinen Kopierkonstruktor angeben, versucht der Compiler, einen zu generieren. Diese vom Compiler generierten Konstruktoren gelten als öffentliche Memberfunktionen. Ein Fehler wird generiert, wenn Sie einen Kopierkonstruktor mit dem ersten Argument angeben, das ein Objekt und kein Verweis ist.
Ein vom Compiler generierter Standardkonstruktor initialisiert das Objekt (installiert vftables und vbtables, wie zuvor beschrieben), und ruft die Standardkonstruktoren für Basisklassen und Member auf, führt aber keine weiteren Aktionen aus. Basisklassen- und Memberkonstruktoren werden nur aufgerufen, wenn sie vorhanden sind, wenn auf sie zugegriffen werden kann und wenn sie eindeutig sind.
Ein vom Compiler generierter Kopierkonstruktor richtet ein neues Objekt ein und führt eine memberspezifische Kopie des Inhalts des zu kopierenden Objekts aus. Wenn Basisklassen- oder Memberkonstruktoren vorhanden sind, werden sie aufgerufen; andernfalls wird der bitweise Kopiervorgang ausgeführt.
Wenn alle Basis- und Memberklassen der Klasse eines bestimmten type über Kopierkonstruktoren verfügen, die ein const-Argument akzeptieren, akzeptiert der vom Compiler generierte Kopierkonstruktor ein einzelnes Argument vom Typ const type**&. Andernfalls akzeptiert der vom Compiler generierte Kopierkonstruktor ein einzelnes Argument des Typs type&**.
Sie können einen Konstruktor verwenden, um ein const- oder ein volatile-Objekt zu initialisieren. Der Konstruktor selbst kann aber nicht als const oder volatile deklariert werden. Die einzige zulässige Speicherklasse für einen Konstruktor ist inline. Die Verwendung eines anderen Speicherklassenmodifizierers mit einem Konstruktor, einschließlich des __declspec-Schlüsselworts, verursacht einen Compilerfehler.
Die stdcall-Aufrufkonvention wird für statische Memberfunktionen und globale Funktionen verwendet, die mit dem __stdcall -Schlüsselwort deklariert werden und keine Variablenargumentliste verwenden. Wenn Sie das Schlüsselwort __stdcall in einer nicht statischen Memberfunktion verwenden, z. B. in einem Konstruktor, wird die thiscall-Aufrufkonvention vom Compiler verwendet."
Konstruktoren von Basisklassen werden nicht von abgeleiteten Klassen geerbt. Wenn ein Objekt vom Typ einer abgeleiteten Klasse erstellt wird, werden für die Erstellung erst die Basisklassenkomponenten und dann die Komponenten der abgeleiteten Klasse verwendet. Der Compiler verwendet den Konstruktor jeder Basisklasse, da dieser Teil des vollständigen Objekts initialisiert wird (außer bei virtuellen Ableitungen, wie in Initialisieren von Basisklassen beschrieben).