Г. Шилдт - Полный справочник по C++ (1109478), страница 141
Текст из файла (страница 141)
$1пс1ибе <сзгххпд> Яхпс1ибе <свхб11)» из?пя пащезрасе зоб? с)авв яттТуре ( с)тат *р; 1пг з?хе; ри)>?хс: Ягттуре(); ЯхтТуре(с?1ат *втх); яхтТуре(сопят яттТуре йо); // Конструктор копирования. -ЯстТуре() ( бе1еге [) р; ) 1т?епб овстеащ йорехасот« (свстеащ йвггоащ, яхттуре йо); ?т?епд хвхтеащ йоретасот» (1вгтеащ йвгтеащ, ясх уре йо); ЯхтТуре оретахот-(Ясттуре йо); // Вычитание подстроки. яггТуре оретагот-(с)тат *в); // Вычитание строки, // взятой в кавычки. // Операторы сравнения объектов класса ЯгтТуре.
хпх оретагот==(ЯСтТуре йо) ( тегитп !втгсщр(р, о.р); ) ?пг орехагот)=(ЯСтТуре йо) ( тегихп вхтсщр(р, о.р); ] хпс оретасот<(Ясхтуре йо) ( техитп зстсщр(р, с.р) < О; ) хпс срехагот>(ясттуре йо) ( теситп встсщр(р, с.р) > О? ) хпг оретасог<=(яхтТуре йо) ( тегитп вгтсщр(р, с.р) <= 0; ) хпг оретагог>=(Ягттуре йо) ( тегитп вгтсщр(р, о.р) >= О; ) // Операции сравнения объектов класса яггТуре // и строк, взятых в кавычки.
хпх оретасот--=(сЬат *в) ( тесихп ?встсщр(р, з); 1пг орехагст!=(с)тат *в) ( теситп вгтсп1р(р, з); ) 1пх оретасот<(с)тат *в) ( тегитп згтслат(р, в) « 0; ) 1пг орегасот>(сбег *з) ( тегитп встсщр(р, в) > 0; ] 1пх оретагот<=(с)тат *в) ( хегитп вбхстр(р, в) <-. О; хпг сретагох>=(с)тат *в) ( тегитп втгсщр(р, з) >= О; ) 1пг встз1хе() ( хесигп вст1еп(р); ) // Возвращает размер строк* . чохб щайезгх(с?тат *в) ( вгтсру(в, р); ) // Обычная строка, // заверщаьтщаяся нулевым байтом. орехасот с?тат *() ( гехихп р; ) // Преобразование в тип с)тат *. )' // Без явной инициализации. Ягттуре::Ягттуре() ( вххе = 1; // Оозлаем место лля нулевого символа.
сту ( Часть ?). Приложения на языке С++ ЯгтТуре оретахот=(ЯСхТуре йо); // // ЯстТуре оретагох=(с)тах в); // // ЯххТуре орегагот+(ЯстТуре йо); // // Ягттуре орехагот+(с?тах "з); // // бх?епб ЯсхТуре оретагот+(снах "в, строки, взятой в кавычки, и объекта ))ри< ваиваниь обьекта класса ЯгтТуре.
Орисваивание строки. взятой в кань.чки. Конкатенаиия обьектов класса Ятхтуре. Конкатенация строк, взятых в ваныч«и. ясгтуре йо); /* Конкатенация класса ЯгтТуре. р = пеи слат[втхе]г ) сатсЬ (Ьаг] а11ос ха) ( сост « "Ошибка при распределении памяти1п"г ехат(1); ) астору(р, ""); // Инициализация с помощью строки, взятой в кавыяки. Боттуре:гзоттуре(сЬат *вот! ( вате = ввт1еп(втт) + 1; // Оседаем место для нулевого символа. сту ( р = пои слат[вйте]; ) сассЬ (Ьаб а11ос ха) ( соцс « "й11осас1оп еттот1п"г ех1С(1); вотсру(р, вст)г // Инициализация с помощью объекта класса 5сттуре. Бсттуре::Всттуре(сопят дохтуре г*о) ( акте = о.в1тег Сту ( р к пем сЬат[в1те]г ) сассЬ (Ьаг] а11ос ха) ( сосо « "Ошибка при распределении памяти1п"г ех1с(1); ) астору(р, о.р)г ) // Вывод строки.
овстеаш йоретасот« (овттеаш йвттеаш, Всттуре йо] ( встеаш « о.р; тегцтп встеаш; ) // Ввод строки. Твттеаш йоретатот»(квттеаш йввтеаш„ ВттТуре йо) сЬат ь[255]г // Размер выбран произвольно // при желании его можно изменить. 1пт 1еп; вттеаш.сет11пе(т, 255) 1еп = вст1еп(с) ь 1г Н (1еп > о.в].те) ае1есе [] о.рг тту ( о.р = пеи слат[1еп]; ) сатсЬ (Ьаг) а11ос ха) соцс « "Ошибка при распределении памятиМ"г ехкс(1)г ) о. айте = 1егм Глава 39. Интеграция новых классов: пользовательский класс для работы со строками 743 ) всхсру(о.р, с); хеспхп вххеаю; ) // Присваивание объекту класса Ясхтуре // другого объекта этого типа.
яохтуре яххтуре::орегахох=(ЯСхтуре ао) ( ЯпхТуре оетр(о.р); 11(о.в1хе > вххе) ( де1еое [] р; // Освобождаем старую область памяти. сху ( р = пеи спаг[о.вххе); сахсЬ (Ьах) а11ос ха) ( соих сс "Ошибка при распрелелении памяти1п'; ехас(1); вххе = о.вххе; ) всхсру(р, о.р); всхсру(хепр.р, о.р); хесцхп сешр; // Присваивание строки, взятой в кавычки, // объекту класса Ясхтуре. ясхтуре яххтуре::орехаоох=(слег *в) ( 1пс 1еп = всх1еп(в) + 1; 11(в1хе < 1еп! о)е1еое [] Р; сху ( р = пеы слах[1еп); сассЬ (Ьаб.а11ос ха) ( соио « "Ошибка при распределении памяти)п"/ ехах(1): ) в1хе = 1еп; ) всхсру(р, в); хебвхп *спаяв; ) // )(онкатенапия двух объектов класса Ясхтуре.
ясхтуре яххтуре::орехасох+(ясхтуре ао) ( 1пх 1еп; Яххтуре Хешр; с)е1ехе [) хешр.р," 1еп = всх1еп(о.р! + вхх1еп(р) + 1; Сешр.вххе = 1еп; сху [ Хешр.р = пеи спах[1еп]; Часть )[. Приложения на яамке С++ ) сатсЬ (Ьаб а11ос ха) сост « "Ошибка при распределении памяти1п"; ехал(1)г ) астору (тешр. р, р); вттсас(тешр.р, о.р)г тетцтп тешр; ) // Конкатенация объекта класса ЯстТуре // и строки; взятой в кавычки. БттТуре БттТуре::оретатот+(слал *в) ( Бпт 1егп ЯстТуре тешр; г)е1еге () сешр Р' 1еп = вгт1еп(в) + вгт1еп(р) + 1; (;ешр.втте = 1епг тту ( тешр.р = пем сьат[1еп]; ) сатсЬ (Ьаб а11ос ха) сост « "Ошибка при распределении памяти1п"; ех1т(1); ) вттсру(гагар.р, р); вттсат(гешр.р, в); тегцтп тешрг // Конкатенация строки, взятой в кавычки, // с объктом класса БттТуре.
БттТуре оретатот+(слал *в, БттТуре ао) 1пс 1еп; Бтттуре гешрг с)е1ете (] сешр.рг 1еп = вст1еп(в) + вст1еп(о.р) + 1; Гешр.вузе = 1епг гту ( гешр.р = пею сЬат(1еп)г сатсЬ (Ьаг) а11ос ха) сост « "Ошибка при распределении памяти1п"г ехБС(1) г ) вттсру(сешр.р, в!; вттсат(сешр.р, о.р) тетцтп тешр( Глава 39. Интеграции иовмк классов: лольэовательский класс длв работы со строками 74р // Вычитание подстроки из объекта класса БгхТуре. Бггтуре Бггтуре::орегасог-(Бтттуре аяиЬягт) Бгттуре Селрр(р); сЬат "я1; 1пс я1 Ест(1=0; *я1; 1++) ( 1Е(*я1(=*яОЬвгт.р) // Если символ не ввлветсв // первой буквой подстроки, // копируем его в объект секр. гетр.р[1) = "я1; в1++; ) е1яе йог(3=0; яиЬягт.р[3 11('.яиЬЯСг.р[3]) ]==я1[3) аа яоЬягх-р[3] ' 3++) // Если подстрока обнаружена, // удаляем ее.
продолжаем копирование. // Вычитание строки, взятой в кавычки, из // объекта класса Бсхтуре. Бггтуре БггТуре::оретагог-(слаг *яиЬясг) ( Бггтуре Сеир(р); спаг "я1; Епг 1, 3," я1 = р; Еог(1=0; *я1; 1+ъ) 1Е(~я1!а*яиЬягг) ( // // гепр.р[1) = *я1; // я1++: ) е1яе ( Ест(3=0; воЬягт[3]= 1г(!яоЬягг[3)) ( // // Если символ не является первой буквой подстроки, копируем его в объект Оетр. =Я1 [3] аа ЯиЬЯГх[3]; 3+~ ) Если подстрока обнаружена, удаляем ее. продолжаем копирование.
в1 1 †; ) е1яе ( // Если нет. Севр.р[1] = *я1: я1++; ) ) ) севр.р[1) = '10'; теготп Гевр; ) я1 += 1--; ) е1яе ( // Если нет, сепр.р[1) = "я1; я1++; ) ) Часть )(. Првложеяиз на языке С++ Херр.р[х) = '10'; хехпхп секр; ) хпх тахо() ЯС Туре в1("Работа со строковыми объектами.1п") В ох Туре в2 ( Б1 ); Яахтуре БЗ; снах в[80)г сопх « Б1 «» Б2; БЗ = БТг соих « Б1; БЗ.гаа)<евах(я)г сопх «« "Вреобразсвание В строку: " <« Б; Б2 = "Вто — новая строка.' сопх «< Б2 « епй1; Вьстуре Б4(" И зта тоже.") Б1 = Б2+Б4; сопх « Б1 «« епб1; х Т ( Б2.= =я 3 ) хГ(Б2!=БЗ) хГ(Б1<Б4) хх б (Б1>н4) 3 Р (Б1<=-Б4) хх(Б1>=Б4) гхб(Б2 > "АВС" ) сопх « "Строка Б2 больае строки АВСхтгхп "опе сюо с)х ее опе съо спхеетп" г 'сыо"; « 'Исколнал строка: ' « Б1; « 'Строка после вывитанин полстроки тио: в1 — Б2г « БЗ; епа1г ЕМ ПРНВЕ строки С+» весьма забавны1п"г БЗ: "ВСЕМ П(-ИВГ Х'! "; правда ли, " + БЗ; БЗ.
сопс « Б4 = "Вс БЗ = Б4 сопс « БЗ = БЗ БЗ = 'Не соос « Б1 = БЗ вЂ” "весьма сопх « Б1; БЗ = Б1; попс « "Ввелите строку: схп » Б1; Глава а9. Интеграция новых классов: пользовательский класс для работы сс строками 747 Б1 Б2 попс сопс зЗ сопх сепо « "Строки попс « "Строки сонь « "Строка сопв « "Строка соих « 'Строка сопя « ":трока равньг. тп"; не раяньп Хп" г Б1 меньзе строки Б41п"г з1 бельме строки Бато"г в) меньае или равна строке Б41п"г Б1 бользе или равна строке Б41п"г сопя «я1 «епд1; сосо « "Строка я1 состоит ня ' « я1,ягея1яе() « " символов. 1п"; рпея(я1); // Преобразование в тип сваг я1 = я2 = яЗ: попе « я1 « я2 « я31 я1 = я2 = яЗ = "Пока соне я< в1 « я2 « яЗ: геспгп 0: ) Программа выводит на экран следующие строки.
Работа со строковыми объектами. Работа со строковыми объектами. Работа со строковыми объектамн. Преобразование в строку: Работа со строковыми объектами. Это в новая строка. Это — новая строка. И эта тоже. Строки не равны. Строка я1 больше строки я4 Строка в1 больше или равна строке я4 Строка я2 белья~а строки АВС Исходная строка: опе Сио Снгее опе Еио Епгее Строка после вычитания подстроки Еыо: опе ЕЬгее опе епгее Всем привет, строки С++ весьма забавны Не правда ли, строки С++ весьма забавны Не правда ли, строки С++ забавны Введите строку: 1 1г йе С++ Строка я1 состоит из 10 символов 1 11Ке с++ Не правда ли, строки С++ забавны Не правда лн, строки С++ забавны Не правда ли, строки С++ забавны Пока Пока Пока Применение класса 8$гТуре В завершение главы рассмотрим два примера, иллюстрирующих применение класса вектуре.
Как мы увидим, благодаря операторам, определенным в зтом классе, и возможности преобразования его объектов в тип сйак * класс вектуре полностью совместим со средой программирования на языке С++. Иначе говоря, он ничем не отличается от любого другого типа, предусмотренного в языке С++. В первом примере создается простой словарь, состоящий из объектов класса вехтуре. Сначала он создает двухмерный массив„состоящий из объектов класса веятуре. Первым элементом каждой пары строк является ключевое слово, а вторая строка содержит список синонимов и родственных слов.