|
Программирование >> Операторы преобразования типа
лательное преобразование к типу char*. Но так как строковые литералы все же не относятся к тину string, между новыми* объектами строкового класса и традиционными С-строками существует тесная связь: С-строки могут использоваться практически в любых операциях вместе со строками (сравнение, присоединение, вставка и т. д.). В частности, поддерживается автоматическое преобразование типа const char* в строку. С другой стороны, не поддерживается автоматическое преобразование строковых объектов в С-строки. Возможность такого преобразования была исключена по соображениям безопасности - чтобы предотвратить непреднамеренные преобразования типов, приводящие к странным последствиям (а тип char* часто ведет себя довольно странно) и неоднозначности (например, в выражении, объединяющем строку string с С-строкой, можно было бы выполнять преобразование как string в char*, так и наоборот). Вместо этого в классе string были определены специальные функции для создания или записи/копирования С-строк. В частности, функция c str() переводит содержимое строки в формат С-строки (то есть преобразует его в символьный массив с последним символом \0). Функция соруО позволяет копировать и записывать строковые значения в существующие С-строки и символьные массивы. Следует помнить, что в строках не существует специальной интерпретации символа \0, который в традиционных С-строках является признаком конца строки. Символ \0 может входить в строки наравне с любым другим символом. Также учтите, что вместо параметра char* нельзя передавать NULL-указа-тель - это приводит к странным последствиям. Дело в том, что NULL относится к целочисленному типу и в перегруженных операциях интерпретируется как число О или символ со значением 0. Преобразование содержимого строки в массив символов или С-строку осуществляется тремя функциями. О data(). Возвращает содержимое строки в виде массива символов. Возвращаемое значение не является действительной С-строкой, поскольку к нему не присоединяется символ \0. О с г(). Возвращает содержимое строки в формате С-строки (то есть с завершающим символом \0). О сору(). Копирует содержимое строки в символьный массив, передаваемый при вызове. Завершающий символ \0 не присоединяется. Функции data() и c str() возвращают массив, принадлежащий строке, поэтому вызывающая сторона не должна модифицировать или освобождать память. Пример: std::string sC12345 ): atoiCs.c str()) Преобразование строки в целое число fCs.dataO.s.lengthO) Вызов функции для символьного массива и количества символов char buffer[100]; s.copy(buffer.lOO); Копировать не более 100 символов s в buffer s.copy(buffer,100.2); Копировать не более 100 символов s в buffer. начиная с третьего символа s Обычно в программе следует работать со строками, а их преобразование в С-строки или символьные массивы должно производиться непосредственно перед тем, как вам потребуется содержимое строки в виде типа char*. Помните, что возвращаемые значения функций c str() и data() остаются действительными только до следующего вызова неконстантной функции для той же строки: std::string s; foo(s.c strO); Pe3ynbTaTS.c strO остается действительным на время выполнения команды const char* р: р = s.c strO: р ссылается на содержимое s в формате С-строки foo(p); OK (значение р остается действительный) S += ext ; Значение р становится недействительным foo(p): ОШИБКА: недействительное значение аргумента р Размер и емкость Чтобы правильно и эффективно использовать строки, необходимо хорошо понимать, как связаны их размер и емкость. Для строк существуют целых три размера , О size() и length(). Эти функции возвращают количество символов в строке и являются эквивалентными. Функция emptyO проверяет, равно ли количество символов нулю (то есть является ли строка пустой). По возможности используйте ее вместо функций IengthO и size(), поскольку эта функция может работать быстрее. О max si2e(). Эта функция возвращает максимальное количество символов, которые могут содержаться в строке. Обычно все символы строки хранятся в одном блоке памяти, что может привести к дополнрггельным ограничениям. В остальных случаях это значение обычно равно максимальному значению типа индекса, уменьшенному на 1. Единица вычитается по двум причинам: во-первых, максимальное значение представляет проз, и, во-вторых, реализация может дописать \0 в конец внутреннего буфера, чтобы при преобразовании строки в формат С-строк (например, при вызове c str()) можно было просто вернуть этот буфер. Если в результате операции должна быть создана строка, длина которой превышает max size(), класс генерирует исключение length errc>r. О capacityO. Эта функция возвращает емкость строки, то есть количество символов, которые можно сохранить в строке без перераспределения ее внутренней памяти. В данном случае эквивалентность функций объясняется тем, что length() возвращает длину строки по аналогии с функцией strien() для обычных С-строк, а функция size() поддерживается всеми контейнерными классами и возвращает количество элементов в соответствии с архитектурными канонами STL. Достаточная емкость строки важна по двум причинам: О в результате перераспределения памяти становятся недействительными все ссылки, указатели и итераторы, ссылающиеся на символы строки; О на перераспределение памяти тратится время. Следовательно, если в программе используются указатели, ссылки и итераторы, относящиеся к символам строки, или если программа критична по скорости, следует учитывать ее емкость. Функция reserveO помогает предотвратить перераспределение памяти. Она заранее резервирует нужную емкость и обеспечивает действительность ссылок (при условии, что размер строки не превыщает зарезервированную емкость): std::str1ng s; Создание пустой строки s.reserve(80): Резервирование памяти для 80 символов В принципе концепция емкости для строк похожа на концепцию емкости eeicropoB (см. с. 157), но с одним важным отличием: строки позволяют вызывать функцию reserveO для сокращения емкости. Вызов reserveO с аргументом, меньшим текущей емкости, фактически является запросом на сокращение емкости, не обязательным для выполнения. Если аргумент меньше текущего количества символов, то емкость сокращается до текущего размера строки. Следовательно, даже если вы хотите сократить емкость, вызов функции еще не гарантирует желаемого результата. По умолчанию аргумент функции reserve() для строк равен нулю. Следовательно, вызов reserve() без аргументов всегда означает запрос на сокращение емкости до текущего размера строки, но этот запрос не обязателен для выполнения: S.reserveO: Запрос на сокращение емкости до текущего размера Запрос на сокращение емкости не обязателен для выполнения, поскольку способ достижения оптимального быстродействия определяется реализацией. В реализациях строковых классов могут использоваться разные критерии оптимизации по скорости и затратам памяти. Следовательно, некоторые реализации могут увеличивать емкость с большими приращениями и вообще не поддерживать ее сокращения. Тем не менее в стандарте указано, что емкость строки может уменьшаться только вследствие вызова функции reserve(). Это гарантирует, что ссылки, указатели и итераторы останутся действительными даже при удалении и изменении символов (если они относятся к позициям, предшествующим позиции модификации). Обращение к символам Строки предоставляют возможность чтения и записи хранящихся в них символов. Обращение к отдельному символу производится одним из двух способов: оператором индексирования [] или функцией atO. Обе операции возвращают символ в позиции с заданным индексом. Как обычно, первому символу
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |