Podsumowanie — klasa String
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 26 z 104.
Wyzwanie
ŁatwyZbudujmy 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ęStringzgodnie z Regułą Pięciu. Klasa powinna zarządzać wskaźnikiemchar*o nazwiedataoraz 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)
- Konstruktor domyślny, który tworzy pusty ciąg znaków (przydziel pojedynczy znak na terminator null, ustaw długość na 0). Wypisz
main.cpp: Pokaż współdziałanie wszystkich konstruktorów. Wczytaj ciąg tekstowy z wejścia, a następnie:- Utwórz obiekt
Stringo nazwies1, używając konstruktora domyślnego - Utwórz obiekt
Stringo nazwies2z wczytanym tekstem - Utwórz obiekt
Stringo nazwies3, kopiującs2 - Utwórz obiekt
Stringo nazwies4, przenosząc dane zs2 - Wypisz
"--- Status ---" - Dla każdego ciągu znaków (od s1 do s4) wypisz
"s<n>: \"<text>\" (length: <len>)"
- Utwórz obiekt
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
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online