Parametrisierter Konstruktor
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 19 von 104.
Ein parametrisierter Konstruktor nimmt Argumente entgegen, mit denen Sie ein Objekt zum Zeitpunkt der Erstellung mit bestimmten Werten initialisieren können. Anstatt sich auf Standardwerte zu verlassen, können Sie den Anfangszustand jedes Objekts individuell anpassen.
class Player {
std::string name;
int health;
int level;
public:
Player(std::string n, int h, int lvl) {
name = n;
health = h;
level = lvl;
}
};
Player hero("Archer", 100, 5);
Player mage("Wizard", 80, 7);Sie können mehrere parametrisierte Konstruktoren mit unterschiedlichen Parameterlisten definieren. Dies wird als Überladen von Konstruktoren bezeichnet, und der Compiler wählt basierend auf den von Ihnen angegebenen Argumenten den passenden aus.
class Rectangle {
int width, height;
public:
Rectangle(int side) { // Quadrat
width = height = side;
}
Rectangle(int w, int h) { // Rechteck
width = w;
height = h;
}
};
Rectangle square(10); // Ruft den ersten Konstruktor auf
Rectangle rect(10, 20); // Ruft den zweiten Konstruktor aufParameter können Standardwerte haben, wodurch einige Argumente optional werden. Dies reduziert die Notwendigkeit für mehrere überladene Konstruktoren.
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // damage ist standardmäßig 10
Enemy dragon("Dragon", 50); // damage wird auf 50 gesetztErinnern Sie sich an die vorherige Lektion: Sobald Sie einen parametrisierten Konstruktor definieren, generiert der Compiler keinen Standardkonstruktor mehr automatisch. Wenn Sie beide benötigen, müssen Sie den Standardkonstruktor explizit definieren.
Aufgabe
EinfachLassen Sie uns ein Produktinventarsystem erstellen, das zeigt, wie parametrisierte Konstruktoren es Ihnen ermöglichen, Objekte mit spezifischen Anfangswerten zu erstellen, und wie das Überladen von Konstruktoren Flexibilität bei der Objekterstellung bietet.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
Product.h: Definieren Sie eineProduct-Klasse, die Artikel in einem Inventar darstellt. Ihre Klasse sollte Folgendes haben:- Private Attribute für
name(string),price(double) undquantity(integer) - Einen Konstruktor, der alle drei Parameter (name, price, quantity) entgegennimmt, um ein Produkt vollständig zu initialisieren
- Einen Konstruktor, der nur Name und Preis entgegennimmt, wobei die Menge standardmäßig auf
1gesetzt wird - Einen Konstruktor, der nur einen Namen entgegennimmt, wobei der Preis standardmäßig auf
0.0und die Menge standardmäßig auf0gesetzt wird - Eine
display()-Methode, die die Produktinformationen im Format"<name>: "ausgibt: $ (x )"lt;price> (x<quantity>)" - Eine
getTotalValue()-Methode, die den Preis multipliziert mit der Menge zurückgibt
- Private Attribute für
main.cpp: Demonstrieren Sie alle drei Konstruktoren, indem Sie Eingaben lesen und Produkte auf verschiedene Arten erstellen. Lesen Sie Folgendes aus der Eingabe:- Erste Zeile: ein Produktname, Preis und Menge (durch Leerzeichen getrennt)
- Zweite Zeile: ein Produktname und Preis (durch Leerzeichen getrennt)
- Dritte Zeile: nur ein Produktname
display()für jedes Objekt auf und geben Sie dann den Gesamtwert aller drei Produkte zusammen im Format"Total inventory value: "Total inventory value: $aus."lt;value>"
Geben Sie den Preis mit zwei Dezimalstellen aus. Wenn Sie beispielsweise ein Produkt "Laptop" mit dem Preis 999.99 und der Menge 5 erstellen, sollte die Anzeige "Laptop: $999.99 (x5)" lauten.
Binden Sie Ihre Header-Datei in main.cpp mit #include "Product.h" ein.
Probier es selbst
#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// Erstes Produkt lesen: Name, Preis und Menge
string name1;
double price1;
int quantity1;
cin >> name1 >> price1 >> quantity1;
// Zweites Produkt lesen: Name und Preis
string name2;
double price2;
cin >> name2 >> price2;
// Drittes Produkt lesen: nur Name
string name3;
cin >> name3;
// TODO: Erstellen Sie drei Product-Objekte mit dem jeweils passenden Konstruktor
// TODO: Rufen Sie display() für jedes Produkt auf
// TODO: Berechnen und drucken Sie den gesamten Inventarwert
// Format: "Total inventory value: $<value>"
// Verwenden Sie fixed und setprecision(1) für eine Dezimalstelle
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