Standardkonstruktor
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 18 von 104.
Ein Standardkonstruktor ist ein Konstruktor, der ohne Argumente aufgerufen werden kann. Er initialisiert ein Objekt, wenn keine Initialwerte angegeben werden. Jede Klasse benötigt eine Möglichkeit, Objekte in einem gültigen Standardzustand zu erstellen.
Wenn Sie keinen Konstruktor definieren, generiert der Compiler einen impliziten Standardkonstruktor, der für primitive Typen nichts tut und Standardkonstruktoren für Member-Objekte aufruft.
class Player {
int health;
int score;
public:
Player() { // Standardkonstruktor
health = 100;
score = 0;
}
};
Player p1; // Ruft den Standardkonstruktor auf
Player p2{}; // Ruft ebenfalls den Standardkonstruktor aufSobald Sie einen Konstruktor definieren (wie einen parametrisierten), generiert der Compiler keinen Standardkonstruktor mehr. Sie müssen explizit einen definieren, wenn Sie ihn weiterhin benötigen.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // Nur parametrisierter Konstruktor
};
Enemy e1(10); // Funktioniert
Enemy e2; // Fehler! Kein StandardkonstruktorIn modernem C++ können Sie den vom Compiler generierten Standardkonstruktor explizit mit = default anfordern:
class Item {
int id;
public:
Item() = default; // Compiler generiert Standardkonstruktor
Item(int i) : id(i) {}
};Standardkonstruktoren sind essenziell für das Erstellen von Arrays von Objekten und für Klassen, die in Containern wie std::vector verwendet werden, welche möglicherweise Elemente ohne Argumente konstruieren müssen.
Aufgabe
EinfachLassen Sie uns ein einfaches Zählersystem bauen, das demonstriert, wie Standardkonstruktoren Objekte in einen gültigen Anfangszustand initialisieren.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
Counter.h: Definieren Sie eineCounter-Klasse, die einen Zählwert verfolgt. Ihre Klasse sollte Folgendes haben:- Ein privates
count-Attribut (Integer) - Ein privates
name-Attribut (String), um den Zähler zu identifizieren - Einen Standardkonstruktor, der
countmit0undnamemit"Unnamed"initialisiert und dann"Counter created: <name>"ausgibt - Eine
increment()-Methode, die den Zähler um 1 erhöht - Eine
getCount()-Methode, die den aktuellen Zählwert zurückgibt - Eine
getName()-Methode, die den Namen des Zählers zurückgibt
- Ein privates
main.cpp: Demonstrieren Sie, dass Standardkonstruktoren funktionieren, wenn Objekte auf verschiedene Arten erstellt werden. Lesen Sie eine Zahl aus der Eingabe ein, die angibt, wie oft der Zähler erhöht werden soll, und dann:- Erstellen Sie einen Counter mittels direkter Initialisierung:
Counter c1; - Erstellen Sie einen weiteren Counter mittels Klammer-Initialisierung:
Counter c2{}; - Erhöhen Sie
c1so oft, wie durch die Eingabe angegeben - Geben Sie
"<name>: <count>"für c1 aus - Geben Sie
"<name>: <count>"für c2 aus
- Erstellen Sie einen Counter mittels direkter Initialisierung:
Beide Zähler sollten dank Ihres Standardkonstruktors bei 0 beginnen, aber nur c1 wird erhöht. Dies zeigt, wie Standardkonstruktoren sicherstellen, dass jedes Objekt in einem vorhersehbaren, gültigen Zustand beginnt, unabhängig davon, wie es erstellt wurde.
Binden Sie Ihre Header-Datei in main.cpp mit #include "Counter.h" ein.
Spickzettel
Ein Standardkonstruktor (default constructor) ist ein Konstruktor, der ohne Argumente aufgerufen werden kann. Er initialisiert ein Objekt, wenn keine Initialwerte angegeben werden.
class Player {
int health;
int score;
public:
Player() { // Standardkonstruktor
health = 100;
score = 0;
}
};
Player p1; // Ruft den Standardkonstruktor auf
Player p2{}; // Ruft ebenfalls den Standardkonstruktor aufWenn Sie keinen Konstruktor definieren, generiert der Compiler einen impliziten Standardkonstruktor. Sobald Sie jedoch einen Konstruktor definieren (z. B. einen parametrisierten), generiert der Compiler keinen Standardkonstruktor mehr automatisch.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // Nur parametrisierter Konstruktor
};
Enemy e1(10); // Funktioniert
Enemy e2; // Fehler! Kein StandardkonstruktorSie können den vom Compiler generierten Standardkonstruktor explizit mit = default anfordern:
class Item {
int id;
public:
Item() = default; // Compiler generiert Standardkonstruktor
Item(int i) : id(i) {}
};Standardkonstruktoren sind essenziell für das Erstellen von Arrays von Objekten und für Klassen, die in Containern wie std::vector verwendet werden.
Probier es selbst
#include <iostream>
#include "Counter.h"
using namespace std;
int main() {
// Lies die Anzahl der Inkrementierungen ein
int n;
cin >> n;
// TODO: Erstelle einen Counter mittels direkter Initialisierung: Counter c1;
// TODO: Erstelle einen weiteren Counter mittels Brace-Initialisierung: Counter c2{};
// TODO: Inkrementiere c1 so oft, wie durch n angegeben
// TODO: Gib "<name>: <count>" für c1 aus
// TODO: Gib "<name>: <count>" für c2 aus
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container