![]() |
|
Программирование >> Расширенная версия языка c++
14.7. Строковый класс Как известно, в C++ встроеннхй строковхй тип даннхх сам по себе не поддерживается. Тем не менее дж обработки строк здесь имеется две возможности. Во-первых, можно использовать хорошо вам знакомый оканчивающийся нулем символьный массив. О таком массиве иногда говорят как о строке в стиле С (С string). Второй метод, который и рассматривается в этом разделе, подразумевает использование объектов типа string. Фактически, класс string явжется конкретизацией более общего класса-щаблона basic string. На самом деле у класса basic string имеется два производных класса: класс string, который поддерживает строки 8-разрядных символов, и который поддерживает строки широких символов. Поскольку при обхчном программировании чаще всего имеют дело именно с 8-разрядными символами, мы рассмотрим только версию string базового класса basic string. Перед тем как начать изучение string, важно понять, почему он включен в библиотеку классов С++. Стандартные классы появились в С++ не случайно. Фактически, вхохючешхю в библиотехсу каждого нового хохасса сопутствовало множество споров и дискуссий. Добавление в C++ класса string на первый взгляд кажется исключением из этого правила, поскольку в C++ в качестве строк уже поддерживаются оканчивающиеся нулем массивы. Тем не менее это далеко не так, и вот почему: оканчивающиеся нулем символьные массивы нельзя обрабатывать посредством стандартных операторов C++ и они не могут быть частью обычных выражений C++. Например, рассмотрим следующий фрагмент программы: charsl[80), s2[80], s3(e0]; . , ....... ► . .l sl = раз ; не допускается * s2 = два ; не допускается - s3 si s2; ошибка, снова не допускается 2. Алгоритм CTge() выполняет слияние двух упорядоченных последовательностей, а результат слияния размещает Б третьей последовательности. Ниже показана одна из основных форм этого алгоритма: teiBplateKclass Inlterl, class Inlter2, class OutTter> Outiter merge(Inlterl HavaJtol, Inlterl охончаиив!, Inltera ялчалог, Inlter2 ожончанйв2, Outiter pe3yja.r&T) ; Последовательности, предназначенные дж слияния, обозначены итераторами начало!, окончание! и начало!, окончание!. Место размещения итоговой последовательности обозначено итератором результат. Алгоритм возвращает итератор конца итоговой последовательности. Продемонстрируйте работу этого алгоритма. Как показано в комментариях, в C++ нельзя использовать оператор присваивания, чтобы дать символьному массиву новое значение (за исключением инициализации), а для конкатенации двух строк нельзя использовать оператор сложения. Эти операции приходится выполнять с помощью показанных ниже библиотечных функций: strcpytsl, раз ); strcpy{s2, два ); - strcDvfs3, si); - strcpy (s3, s2); ~r- Поскольку оканчивающиеся нулем символьные массивы по своей сути технически не явжются типами данных, к ним нельзя применять операторы C++. Это приводит к тому, что даже самые элементарные операции со строками становятся чрезвгчайно запутанными. Невозможность использования стандартных операторов C++ для работы с оканчивающимися нулем символьными массивами и стала основной причиной разработки стандартного строкового класса. Вспомните, когда вы в C++ определяете класс, вы определяете новый тип данных, который может быть полностью интегрирован в среду программирования C++. Само собой это означает, что относительно нового класса можно перегружать операторы. Таким образом, благодаря добавлению в C++ стандартного класса string, становится возможным обрабатывать строки точно таким же образом, каким обрабатываются данные других типов, а именно с помощью операторов. Имеется, однако, и еще один довод в пользу использования стандартного класса string - это обеспечение безопасности. Неопытный или неосторожный программист может очень легко вхйти за границе! массива, в котором хранится оканчивающаяся нулем строка. Например, рассмотрим стандартную функцию копирования строк strcpy(). В этой функции совершенно отсутствуют какие бы то ни бхло атрибутах, предназначенные для контроля границ целевого массива. Если в исходном массиве оказывается больше символов, чем может поместиться в целевом массиве, вполне возможна (и даже весьма вероятна) программная или даже системная ошибка. Как вы в дальнейшем увидите, стандартный класс string предотвращает саму возможность возникновения подобных ошибок. Итак, для включения в C++ стандартного класса string имеется три довода: совместимость (теперь строка становится типом данных), удобство (можно использовать стандартные операторы C++) и безопасность (границы массива не нарушаются). Запомните, что это не доводы в пользу отказа от обхч-ных, оканчивающихся нулем массивов. Они остаются наиболее эффективным способом реализации символьных строк. Тем не менее, если при создании приложения скорость выполнения программы не является доминирующим фактором, новый класс string предоставляет вам безопасный и полностью интегрированный в среду программирования C++ способ обработки строк.
Хотя строковый класс традиционно не считают частью библиотеки стандартных шаблонов, тем не менее, это один из определенных в С++ классов-контейнеров. Это, в частности, означает, что он поддерживает описанные в предыдушем разделе алгоритмы. Кроме этого, для обработки строк имеются дополнительные возможности. Чтобы получить доступ к классу string, в программу следует включить заголовок <string>. Класс string очень велик, в нем имеется множество конструкторов и функций-членов. Помимо этого многие функции-члены имеют массу перегруженных форм. По этой причине в одной главе невозможно рассказать о всех членах класса string. Вместо этого мы исследуем только некоторые, основные его возможности. После получения базовых знаний о работе класса string в целом, все остальное вы сможете легко понять самостоятельно. : В классе string поддерживается несколько конструкторов. Ниже представлены прототипе! трех из них, которые чаще всего используются: String () ; ; , String (const char *С!Ррав:а) ; . > : . ,. г-- string (const string батрака); ,. v- ! В первой форме создается пустой объект типа string. Во второй форме -объект типа string из оканчивающейся нулем строки, обозначенной указателем строка. Эта форма обеспечивает преобразование из оканчивающейся нулем строки в объект типа string. В третьей форме объект типа string создается из другого объекта типа string. Ниже перечислена часть операторов, допустимых при работе с объектами типа string:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |