Повторение — класс String
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 26 из 104.
Задание
ЛегкоДавайте создадим полноценный класс 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)
- Конструктор по умолчанию, который создает пустую строку (выделяет один символ для нулевого терминатора, устанавливает длину в 0). Выведите
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;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнер