|
Программирование >> Разработка устойчивых систем
инициализация объекта string с помощью знака равенства (=); использование объекта string для инициализации другого объекта. : СОЗ:Small String.срр #include <str1ng> using namespace std: int mainO { string imBlank: string heyMom( Where are my socks? ): string standardReply = Beamed into deep space on wide angle dispersion? : string useThlsOneAgain(standardReply): } III:- Таковы простейщие формы инициализации объектов string; их разновидности обладают большей гибкостью и лучше поддаются контролю. В частности, возможно: использование подмножества символьного массива С или строкового объекта С++; объединение нескольких источников инициализационных данных оператором +; выделение подстроки функцией substr() объекта string. Следующая программа демонстрирует перечисленные возможности. : C03:SmallStr1ng2.cpp #include <string> #include <1ostream> using namespace std: int mainO { string si ( What is the sound of one clam napping? ): string s2 ( Anything worth doing is worth overdoing. ): string s3( I saw Elvis in a UFO ): Копирование первых 8 символов string s4(sl. 0. 8): cout s4 endl: Копирование 6 символов из середины источника string s5(s2. 15. 6): cout s5 endl: Копирование из середины в конец string s6(s3. 6. 15): cout s6 endl: Комбинированное копирование string quoteMe = s4 + that + substrO копирует 10 символов начиная с элемента 20 sl.substr(20. 10) + s5 + substrO копирует 100 символов или остаток до конца строки, начиная с элемента 5. with + s3.substr(5. 100) + Функция substrO также может копировать отдельные символы sl.substr(37. 1): cout quoteMe endl: } /:- В первом аргументе функции substr() класса string передается начальная позиция, а во втором - длина подстроки в символах. У обоих аргументов имеются значения по умолчанию. Функция substr() с пустым списком аргументов возвращает копию всего объекта string; это удобный способ копирования строк С++. Программа выводит следующий результат: What is doing Elvis in a UFO What is that one clam doing with Elvis in a UFO? Обратите внимание на последнюю строку примера. С++ позволяет объединять разные способы инициализации string в одной команде, что очень удобно. Также стоит заметить, что последний инициализатор копирует всего один символ из исходного объекта string. Другая, более изощренная, методика инициализации основана на применении строковых итераторов string::begin() и string::end(). Строка интерпретируется как объект-контейнер, в котором начало и конец последовательности символов обозначаются при помощи итераторов (мы уже встречались с контейнерами на примере векторов, а в главе 7 будут рассмотрены и другие их разновидности). В этом варианте конструктору string передаются два итератора, и он копирует символы из одного объекта string в другой: : СОЗ:Stringlterators.Срр #include <string> #include <iostream> #include <cassert> using namespace std; int mainO { string sourceCxxx ): string s(source.begin(). source.endO): assert(s == source): } /:- Операторы с итераторами не ограничиваются вызовами begin() и end(). Итераторы можно увеличивать и уменьшать, а также прибавлять к ним целочисленные смещения, чтобы извлечь подмножество символов из исходной строки. Строки С++ не могут инициализироваться одиночными символами, ASCH-кодами или другими целочисленными значениями. Впрочем, строка может инициализироваться несколькими экземплярами одного символа: : C03:UhOh.cpp #include <string> #include <cassert> using namespace std: int mainO { Ошибка: инициализация одиночным символом недопустима ! string nothingDoingl(a): Ошибка: инициализация целочисленными кодами недопустима ! string nothingDoing2(0x37): Следующий вариант допустим: string okay(5. а): assert(okay == stringCaaaaa )): } /:- Операции со строками Каждому программисту с опытом работы на С хорошо знакомы функции записи, поиска, модификации и копирования массивов char. У функций стандартной библиотеки С имеются два недостатка. Во-первых, они неформально делятся на две категории: простые функции и те, которым при вызове необходимо передать количество символов, участвующих в выполняемой операции. Список библиотечных функций С для работы с символьными массивами поражает неопытного пользователя: перед ним оказывается длинный перечень загадочных и неудобопроизносимых имен функций. Типы и количество аргументов у этих функций более или менее выдержаны, но для их правильного использования необходимо тщательно следить за именами и передачей параметров. Однако у функций стандартной библиотеки С есть второй недостаток: все они подразумевают, что символьный массив завершается нуль-терминатором. Если нуль-символ по недосмотру или ошибке будет пропущен или перезаписан, ничто не помешает функциям символьных массивов С выйти за пределы строки. Результаты обычно оказываются катастрофическими. Строковые объекты С++ существенно превосходят свои прототипы С по удобству и безопасности. Количество имен функций класса string примерно соответствует количеству функций в библиотеке С, но механизм перегрузки существенно расширяет их функциональность. В сочетании с разумными правилами выбора имен и выбором аргументов по умолчанию, работать с классом string гораздо проще и удобнее, чем с функциями символьных массивов стандартной библиотеки С. Присоединение, вставка и конкатенация строк Одно из самых ценных и удобных свойств строк С++ состоит в том, что они автоматически растут по мере надобности, не требуя вмешательства со стороны программиста. Работа со строками не только становится более надежной, из нее почти полностью устраняются нетворческие операции - отслеживание границ памяти, в которой хранятся данные строк. Например, если при создании строковый объект был инициализирован 50 экземплярами символа X , а позднее в нем были сохранены 50 экземпляров строки Zowie , объект сам выделит достаточный блок памяти в соответствии с увеличившимся объемом данных. Но в полной мере это свойство проявляется в ситуациях, когда обрабатываемые в программе строки изменяются в размерах, но вы не можете оценить эти изменения количественно. Строковые функции append() и insert:() автоматически перераспределяют память при увеличении строки: : C03:StrSize.cpp #include <str1ng> #include <iostream> using namespace std; int mainO { Первый аргумент определяет количество экземпляров второго аргумента в строке. Второй аргумент может быть только одиночным символом (char), но не символьным массивом.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |