C++ для начинающих - страница 37

стр.

* вычисление длины строки. Узнать длину строки встроенного типа можно с помощью функции strlen();

возможность узнать, пуста ли строка. У встроенных строк для этой цели приходится проверять два условия:


>char str = 0;

>//...

>if ( ! str || ! *str )

>return;


>*

Класс string стандартной библиотеки С++ реализует все перечисленные операции (и гораздо больше, как мы увидим в главе 6). В данном разделе мы научимся пользоваться основными операциями этого класса.

Для того чтобы использовать объекты класса string, необходимо включить соответствующий заголовочный файл:


>#include 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 в том виде, в каком она находилась бы во встроенном строковом типе.

Приведенный выше пример инициализации указателя char *str все еще не совсем корректен. c_str() возвращает указатель на константный массив, чтобы предотвратить возможность непосредственной модификации содержимого объекта через этот указатель, имеющий тип


>const char *


(В следующем разделе мы расскажем о ключевом слове 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 ] = '_';



Вот и все, что мы хотели сказать о классе string прямо сейчас. На самом деле, этот класс обладает еще многими интересными свойствами и возможностями. Скажем, предыдущий пример реализуется также вызовом одной-единственной функции replace():