|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Класс stringКак мы только что видели, применение встроенного строкового типа чревато ошибками и не очень удобно из-за того, что он реализован на слишком низком уровне. Поэтому достаточно распространена разработка собственного класса или классов для представления строкового типа – чуть ли не каждая компания, отдел или индивидуальный проект имели свою собственную реализацию строки. Да что говорить, в предыдущих двух изданиях этой книги мы делали то же самое! Это порождало проблемы совместимости и переносимости программ. Реализация стандартного класса string стандартной библиотекой С++ призвана была положить конец этому изобретению велосипедов.
В данном разделе мы научимся пользоваться основными операциями этого класса. Вот пример строки из предыдущего раздела, представленной объектом типа string и инициализированной строкой символов: #include <string>string st("Цена бутылки вина\n");Длину строки возвращает функция-член size() (длина не включает завершающий нулевой символ). cout << "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";Вторая форма определения строки задает пустую строку: string st2; // пустая строкаКак мы узнаем, пуста ли строка? Конечно, можно сравнить ее длину с 0: if (! st.size())// правильно: пустаяОднако есть и специальный метод empty(), возвращающий true для пустой строки и false для непустой: if (st.empty())// правильно: пустаяТретья форма конструктора инициализирует объект типа string другим объектом того же типа: string st3(st);Строка st3 инициализируется строкой st. Как мы можем убедиться, что эти строки совпадают? Воспользуемся оператором сравнения (==): if (st == st3)// инициализация сработалаКак скопировать одну строку в другую? С помощью обычной операции присваивания: st2 = st3; // копируем st3 в st2Для конкатенации строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки: string s1("hello, ");string s2("world\n");Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом: string s3 = s1 + s2;Если же мы хотим добавить s2 в конец s1, мы должны написать: s1 += s2;Операция сложения может конкатенировать объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова – объектами класса string: const char *pc = ", ";string s1("hello");string s2("world");string s3 = s1 + pc + s2 + "\n"; Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string: string s1;const char *pc = "a character array";s1 = pc; // правильноОбратное преобразование, однако, не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции: char *str = s1; // ошибка компиляцииЧтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с несколько странным названием c_str(): char *str = s1.c_str(); // почти правильноФункция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе. (В следующем разделе мы расскажем о ключевом слове const). Правильный вариант инициализации выглядит так: const char *str = s1.c_str(); // правильноК отдельным символам объекта типа string, как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания: string str("fa.disney.com");int size = str.size(); for (int ix = 0; ix < size; ++ix) if (str[ ix ] == '.')str[ ix ] = '_';
replace() – один из обобщенных алгоритмов, с которыми мы познакомились в разделе 2.8 и которые будут детально разобраны в главе 12. Эта функция пробегает диапазон от begin() до end(), которые возвращают указатели на начало и конец строки, и заменяет элементы, равные третьему своему параметру, на четвертый. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |