Menu
Coddy logo textTech

Podsumowanie — klasa String

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 26 z 104.

challenge icon

Wyzwanie

Łatwy

Zbudujmy kompletną klasę String, która zarządza własną dynamiczną tablicą znaków, łącząc wszystkie zagadnienia dotyczące konstruktorów i destruktorów z tego rozdziału. To klasyczne ćwiczenie, które odzwierciedla wewnętrzne działanie std::string.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • String.h: Zdefiniuj klasę String zgodnie z Regułą Pięciu. Klasa powinna zarządzać wskaźnikiem char* o nazwie data oraz składową size_t length. Zaimplementuj:
    • Konstruktor domyślny, który tworzy pusty ciąg znaków (przydziel pojedynczy znak na terminator null, ustaw długość na 0). Wypisz "Default constructed"
    • Konstruktor z parametrem, przyjmujący const char*, który kopiuje ciąg znaków C do nowo przydzielonej pamięci. Wypisz "Constructed: <text>"
    • Konstruktor kopiujący, który wykonuje głęboką kopię innego obiektu String. Wypisz "Copied: <text>"
    • Konstruktor przenoszący (oznaczony jako noexcept), który przejmuje własność. Wypisz "Moved: <text>", używając tekstu przed wyzerowaniem źródła
    • Destruktor, który bezpiecznie zwalnia pamięć (sprawdź, czy wskaźnik jest null). Wypisz "Destroyed: <text>" (wypisz "Destroyed: (empty)", jeśli data ma wartość null lub długość wynosi 0)
    • Metodę size(), która zwraca długość
    • Metodę c_str(), która zwraca wskaźnik na znaki (zwróć "", jeśli wskaźnik jest null)
  • main.cpp: Pokaż współdziałanie wszystkich konstruktorów. Wczytaj ciąg tekstowy z wejścia, a następnie:
    • Utwórz obiekt String o nazwie s1, używając konstruktora domyślnego
    • Utwórz obiekt String o nazwie s2 z wczytanym tekstem
    • Utwórz obiekt String o nazwie s3, kopiując s2
    • Utwórz obiekt String o nazwie s4, przenosząc dane z s2
    • Wypisz "--- Status ---"
    • Dla każdego ciągu znaków (od s1 do s4) wypisz "s<n>: \"<text>\" (length: <len>)"

Użyj list inicjalizacyjnych we wszystkich konstruktorach, aby zwiększyć wydajność. Po przeniesieniu s2 powinien być pusty, a jego długość powinna wynosić 0, natomiast s4 powinien zawierać oryginalny tekst. Komunikaty destruktora na końcu pokażą, że wszystkie cztery obiekty są niszczone w odwrotnej kolejności ich tworzenia.

Dołącz <cstring>, aby używać strlen i strcpy, oraz <utility> dla std::move(). Nie zapomnij o strażnikach nagłówka w pliku nagłówkowym.

Spróbuj swoich sił

#include <iostream>
#include <string>
#include "String.h"

using namespace std;

int main() {
    string input;
    getline(cin, input);

    // TODO: Utwórz String s1 za pomocą konstruktora domyślnego

    // TODO: Utwórz String s2 z tekstu wejściowego

    // TODO: Utwórz String s3, kopiując s2

    // TODO: Utwórz String s4, przenosząc s2 (użyj std::move)

    // Wyświetl nagłówek stanu
    cout << "--- Status ---" << endl;

    // TODO: Wyświetl stan każdego łańcucha od s1 do s4
    // Format: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online