Программирование >>  Инициализация объектов класса, структура 

1 ... 29 30 31 [ 32 ] 33 34 35 ... 395


string s1( hello, string s2( world\

s2( world\n );

М1 можем получить третью строку, состоящую из конкатенации первых двух, таким образом:

string s3 = s1 + s2; Если же м1 хотим добавить s2 в конец s1, м1 должны написать:

s1 += s2;

Операция сложения может конкатенировать объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова - объектами класса string:

i string s1( hello );

const char *pc = , ;

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(); почти правильно

Как скопировать одну строку в другую? С помощью обычной операции присваивания:

st2 = st3; копируем st3 в st2

Для конкатенации строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки:



string str( fa.disney.com );

int size = str.size(); for ( int ix = 0; ix < size; ++ix ) if ( str[ ix ] == . )

точки символами подчеркивания:

str[ ix ] =

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

replace( str.begin(), str.end(), );

replace() - один из обобщенных алгоритмов, с которыми мы познакомились в разделе 2.8 и которые будут детально разобраны в главе 12. Эта функция пробегает диапазон от begin() до end() , которые возвращают указатели на начало и конец строки, и заменяет элементы, равные третьему своему параметру, на четвертый.

Упражнение 3.12

(a) char ch = The long and winding road ;

(b) int ival = &ch;

(c) char *pc = &ival;

(d) string st( &ch );

(e) pc = 0; (i) pc = 0;

(f) st = pc; (j) st = &ival;

(g) ch = pc[0]; (k) ch = *pc;

Найдите ошибки в приведенных ниже операторах:

i (h) pc = st; (l) *pc = ival; Упражнение 3.13

Объясните разницу в поведении следующих операторов цикла:

Функция c str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе.

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

const char *

(В следующем разделе мы расскажем о ключевом слове const). Правильный вариант инициализации выглядит так:

const char *str = s1.c str(); правильно

К отдельным символам объекта типа string, как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все



***** Реализация с использованием класса string

#include <iostream> #include <string>

int main() {

int errors = 0;

string str( a very long literal string );

for ( int ix = 0; ix < 1000000; ++ix )

int len = str.size();

string str2 = str;

if ( str != str2 )

cout

<< класс string:

<< errors << ошибок.\n;

*****

while ( st++ ) ++cnt;

while ( *st++ ) ++cnt;

Упражнение 3.14

Даны две семантически эквивалентные программы. Первая использует встроенный

***** Реазация с использованием С-строк ***** строковый тип, вторая - класс string:

#include <iostream> #include <cstring>

int main() {

int errors = 0;

const char *pc = a very long literal string ;

for ( int ix = 0; ix < 1000000; ++ix ) {

int len = strlen( pc ); char *pc2 = new char[ len + 1 ]; strcpy( pc2, pc ); if ( strcmp( pc2, pc )) ++errors;

delete [] pc2;

cout << С-строки:

<< errors << оши6ок.\п ;



1 ... 29 30 31 [ 32 ] 33 34 35 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика