Zusammenfassung - String-Klasse
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 26 von 104.
Aufgabe
EinfachLassen Sie uns eine vollständige String-Klasse erstellen, die ihr eigenes dynamisches Zeichen-Array verwaltet und dabei alle Konstruktor- und Destruktor-Konzepte aus diesem Kapitel zusammenführt. Dies ist eine klassische Übung, die widerspiegelt, wie std::string intern funktioniert.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
String.h: Definieren Sie IhreString-Klasse gemäß der Rule of Five. Ihre Klasse sollte einenchar*-Pointer namensdataund einsize_t length-Mitglied verwalten. Implementieren Sie:- Einen Standardkonstruktor, der einen leeren String erstellt (reservieren Sie ein einzelnes Zeichen für den Null-Terminator, setzen Sie die Länge auf 0). Geben Sie
"Default constructed"aus. - Einen parametrisierten Konstruktor, der einen
const char*entgegennimmt und den C-String in neu reservierten Speicher kopiert. Geben Sie"Constructed: <text>"aus. - Einen Kopierkonstruktor, der eine tiefe Kopie eines anderen Strings durchführt. Geben Sie
"Copied: <text>"aus. - Einen Move-Konstruktor (gekennzeichnet mit
noexcept), der den Besitz überträgt. Geben Sie"Moved: <text>"aus, wobei der Text verwendet wird, bevor die Quelle auf null gesetzt wird. - Einen Destruktor, der den Speicher sicher freigibt (auf null prüfen). Geben Sie
"Destroyed: <text>"aus (geben Sie"Destroyed: (empty)"aus, wenn data null oder die Länge 0 ist). - Eine
size()-Methode, die die Länge zurückgibt. - Eine
c_str()-Methode, die den Zeichen-Pointer zurückgibt (geben Sie""zurück, falls null).
- Einen Standardkonstruktor, der einen leeren String erstellt (reservieren Sie ein einzelnes Zeichen für den Null-Terminator, setzen Sie die Länge auf 0). Geben Sie
main.cpp: Demonstrieren Sie das Zusammenwirken aller Konstruktoren. Lesen Sie einen Text-String von der Eingabe ein und führen Sie dann Folgendes aus:- Erstellen Sie einen
Stringnamenss1mit dem Standardkonstruktor. - Erstellen Sie einen
Stringnamenss2mit dem eingegebenen Text. - Erstellen Sie einen
Stringnamenss3durch Kopieren vons2. - Erstellen Sie einen
Stringnamenss4durch Verschieben (Move) vons2. - Geben Sie
"--- Status ---"aus. - Geben Sie für jeden String (s1 bis s4)
"s<n>: \"<text>\" (length: <len>)"aus.
- Erstellen Sie einen
Verwenden Sie in allen Konstruktoren Initialisierungslisten für mehr Effizienz. Nach dem Move sollte s2 leer sein mit der Länge 0, während s4 den ursprünglichen Text enthält. Die Destruktor-Meldungen am Ende zeigen, wie alle vier Objekte in umgekehrter Reihenfolge ihrer Erstellung bereinigt werden.
Binden Sie <cstring> für strlen und strcpy sowie <utility> für std::move() ein. Vergessen Sie nicht die Header-Guards in Ihrer Header-Datei.
Probier es selbst
#include <iostream>
#include <string>
#include "String.h"
using namespace std;
int main() {
string input;
getline(cin, input);
// TODO: Erstelle String s1 mit dem Standardkonstruktor
// TODO: Erstelle String s2 mit dem eingegebenen Text
// TODO: Erstelle String s3 durch Kopieren von s2
// TODO: Erstelle String s4 durch Verschieben von s2 (verwende std::move)
// Status-Header ausgeben
cout << "--- Status ---" << endl;
// TODO: Status für jeden String von s1 bis s4 ausgeben
// Format: "s<n>: \"<text>\" (length: <len>)"
return 0;
}
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