Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_otvety_k_ekzamenu.doc
Скачиваний:
55
Добавлен:
13.04.2015
Размер:
786.94 Кб
Скачать

20. Класс std::string из стандартной библиотеки. Основная функциональность, способы применения. Особенности внутренней структуры.

Многие программисты, предпочитающие другие языки программирования, часто нарекают на сложность работы со строками в С++. Следует отметить, что эта критика, в основном, направлена на базовое представление строк в языке С в виде массива символов с нулевым завершителем. Действительно, в языке С, реализация вышеупомянутых операций несколько затруднительна, поскольку требует постоянного рассуждения о памяти для хранения символов, использования низкоуровневых функций наподобие strcpy и strcmp, расстановки нулевых завершителей вручную в ряде ситуаций.

Принципы объектно-ориентированного программирования, предоставляемые С++, позволяют эффективно сочетать потребности программистов в удобстве работы со строками вместе с производительностью низкоуровневого представления. В частности, стандартная библиотека предлагает для нужд работы со строками мощный готовый класс std::string, доступный в заголовочном файле <string>.

Этот класс определяет необходимые конструкторы, средства для копирования и перемещения, деструктор. Типичная реализация оптимизирует хранение символов таким образом, что для строк небольшого размера (до 16 символов), кои встречаются в большинстве программ наиболее часто, вообще не происходит динамического выделения памяти. Вместо этого реализация хранит символы в статическом буфере до тех пор, пока строка не увеличивается в размере до достаточно длинной. При дальнейшем росте, std::string выделяет динамическую память подобно векторам из дисциплины “Структуры и алгоритмы обработки данных”.

В связи с этим, объекты std::string можно свободно присваивать, передавать в качестве аргументов функций, возвращать из функций как результат, создавать временные объекты для формирования строк из фрагментов.

Класс std::string также интенсивно использует механизмы перегрузки операторов, в частности:

  • оператор индексной выборки [] для обращения к конкретным символам строки;

  • операторы +, += для конкатенирования строк;

  • операторы сравнения (==, !=, <, <=, >, >=);

  • операторы <<, >> для ввода вывода через потоки (консоль, файлы).

Операторы ввода-вывода особенно удобны, поскольку программисту не нужно заботиться о памяти для вводимых строк, т.к. библиотечные средства выделят ее самостоятельно.

Также, класс std::string предлагает широкий набор вспомогательных методов, полезных для типичных задач со строками. Среди наиболее часто используемых следующие методы:

  • size, length - методы определения длины;

  • empty - метод определения пустоты строки;

  • reserve, capacity - средства резервирования места для хранения символов заранее;

  • clear - метод очистки строки;

  • insert/erase - вставка/удаление фрагментов;

  • replace - замена фрагментов на другие;

  • find, rfind, find_first_of, find_last_of - поиск фрагментов;

  • substr - получение подстроки;

  • с_str - преобразование к строке в стиле языка С (указатель на const char * ).

21. Композиция объектов. Иерархии целое-часть. Структура простейшей композиции по значению в памяти. Ответственность за уничтожение объектов при композиции.

КОМПОЗИЦИЯ (или агрегирование, включение) - простейший способ создания новых более сложных классов путем объединения нескольких объектов существующих классов в единое целое.

Между классом верхнего и нижнего уровня обычно присутствует отношение "целое-часть". Ниже приведен простейший пример композиции — объект двигатель (Engine) является частью объекта автомобиль (Car):

С точки зрения памяти, поля дочернего объекта размещаются внутри родительского объекта целиком. К слову, объект std::string m_model также является дочерним объектом, и размещается полностью в родительском объекте Car, с той разницей, что модель - является объектом-значением, а двигатель - объектом-сущностью.

В одном объекте может быть несколько дочерних объектов - одного или разных типов. Дочерние объекты могут выделяться как вместе с родительским, так и динамически. При этом родительский класс может быть ответственен либо не ответственен за уничтожение дочерних объектов в зависимости от ситуации. Если доступ к объекту имеет только один класс, то он является ответственным за уничтожение, если же кто-то ещё имеет доступ, то тогда не является ответственным за уничтожение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]