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
EinfachErstelle ein einfaches Zählersystem, das demonstriert, wie Standardkonstruktoren Objekte in einem gültigen Ausgangszustand initialisieren.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
Counter.h: Definiere eineCounter-Klasse, die einen Zählerwert verfolgt. Deine Klasse sollte Folgendes enthalten:- Ein privates
count-Attribut (Ganzzahl) - Ein privates
name-Attribut (Zeichenkette), um den Zähler zu identifizieren - Einen Standardkonstruktor, der
countauf0undnameauf"Unnamed"initialisiert und anschließend"Counter created: <name>"ausgibt - Eine
increment()-Methode, die den Zähler um 1 erhöht - Eine
getCount()-Methode, die den aktuellen Zählerstand zurückgibt - Eine
getName()-Methode, die den Namen des Zählers zurückgibt
- Ein privates
main.cpp: Zeige, dass Standardkonstruktoren funktionieren, wenn Objekte auf unterschiedliche Arten erstellt werden. Lies eine Zahl aus der Eingabe ein, die angibt, wie oft der Zähler erhöht werden soll, und:- Erstelle einen Counter mittels direkter Initialisierung:
Counter c1; - Erstelle einen weiteren Counter mittels Initialisierung mit geschweiften Klammern:
Counter c2{}; - Erhöhe
c1so oft, wie durch die Eingabe angegeben - Gib für c1
"<name>: <count>"aus - Gib für c2
"<name>: <count>"aus
- Erstelle einen Counter mittels direkter Initialisierung:
Beide Zähler sollten dank deines Standardkonstruktors bei 0 beginnen, aber nur c1 wird erhöht. Dies zeigt, wie Standardkonstruktoren sicherstellen, dass jedes Objekt unabhängig von seiner Erstellungsweise in einem vorhersehbaren, gültigen Zustand beginnt.
Binde deine Header-Datei in main.cpp mit #include "Counter.h" ein.
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 & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler