Menu
Coddy logo textTech

Повторение — класс String

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 26 из 104.

challenge icon

Задание

Легко

Давайте создадим полноценный класс String, который управляет собственным динамическим массивом символов, объединив все концепции конструкторов и деструкторов из этой главы. Это классическое упражнение, которое отражает внутреннюю работу std::string.

Для организации кода вы создадите два файла:

  • String.h: Определите класс String, следуя Правилу пяти. Ваш класс должен управлять указателем char* с именем data и членом size_t length. Реализуйте:
    • Конструктор по умолчанию, который создает пустую строку (выделяет один символ для нулевого терминатора, устанавливает длину в 0). Выведите "Default constructed"
    • Параметризованный конструктор, принимающий const char*, который копирует C-строку в новую выделенную память. Выведите "Constructed: <text>"
    • Конструктор копирования, который выполняет глубокое копирование другой строки. Выведите "Copied: <text>"
    • Конструктор перемещения (помеченный noexcept), который передает владение. Выведите "Moved: <text>", используя текст до обнуления источника
    • Деструктор, который безопасно освобождает память (проверьте на null). Выведите "Destroyed: <text>" (выведите "Destroyed: (empty)", если данные равны null или длина равна 0)
    • Метод size(), возвращающий длину
    • Метод c_str(), возвращающий указатель на символы (верните "", если он равен null)
  • main.cpp: Продемонстрируйте совместную работу всех конструкторов. Считайте текстовую строку из входных данных, затем:
    • Создайте String с именем s1, используя конструктор по умолчанию
    • Создайте String с именем s2 с входным текстом
    • Создайте String с именем s3 путем копирования s2
    • Создайте String с именем s4 путем перемещения из s2
    • Выведите "--- Status ---"
    • Для каждой строки (от s1 до s4) выведите "s<n>: \"<text>\" (length: <len>)"

Используйте списки инициализации во всех конструкторах для эффективности. После перемещения s2 должна стать пустой с длиной 0, в то время как s4 будет содержать исходный текст. Сообщения деструктора в конце покажут, что все четыре объекта очищаются в порядке, обратном их созданию.

Включите <cstring> для strlen и strcpy, и <utility> для std::move(). Не забудьте про guard-вставки (header guards) в заголовочном файле.

Попробуйте сами

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

using namespace std;

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

    // TODO: Создайте String s1, используя конструктор по умолчанию

    // TODO: Создайте String s2 с введенным текстом

    // TODO: Создайте String s3 путем копирования s2

    // TODO: Создайте String s4 путем перемещения из s2 (используйте std::move)

    // Вывод заголовка статуса
    cout << "--- Status ---" << endl;

    // TODO: Выведите статус для каждой строки от s1 до s4
    // Формат: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

Все уроки раздела Объектно-ориентированное программирование