Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 111

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 105 106 107 108 109 110 < 111 > 112 113 114 115 116 117 .. 341 >> Следующая


Кроме изученных нами, есть еще библиотечные функции для добавления одной строки к другой, сравнения строк, поиска определенного символа в строке и выполнения многих других операций. Описание этих функций вы сможете найти в документации к вашему компилятору. 294

Глава 7. Массивы и строки

Определенные пользователем типы строк

При использовании строкового типа в С++ иногда возникают проблемы. Одна из них заключается в том, что вы не можете использовать совершенно разумное выражение

strDest = strSrc:

для установки равенства одной строки другой. (В некоторых языках, таких, как BASIC, это замечательно работает.) В стандартном классе С++ string, который мы рассмотрим в следующем разделе, эта проблема решена, но на данный момент давайте посмотрим, как мы сможем использовать технологии ООП для самостоятельного решения этой проблемы. Создадим наш собственный класс string, что даст нам возможность представлять строки как объекты класса, который прольет свет на операции стандартного класса string.

Если мы определим наш собственный тип строк, используя класс, то мы сможем использовать выражения присваивания. (Многие другие операции со строками, такие, как объединение, могут быть также упрощены, но мы должны подождать до главы 8 «Перегрузка операций», чтобы увидеть, как это сделать.)

Программа STROBJ создает класс String. (Не путайте этот самопальный класс String со стандартным встроенным классом string, название которого начинается с маленькой буквы 's'.) Приведем листинг:

// strobj.cpp

// строка как класс

!include <iostream>

!include <cstring>

using namespace std:

///////////////////////////////////////////////////////////

class String {

private:

enum { SZ = 80: }: H максимальный размер строки

char str [ SZ ]: Il сама строка

public:

String ( ) Il конструктор без параметров

{ str [ 0 ] = '\01: } String ( char s [ ] ) Il конструктор с одним параметром

{ strcpy ( str, s ): } void display ( ) Il показ строки

{ cout « str: }

void concat ( String s2 ) // сложение строк {

if ( Strien ( str ) + Strien ( s2.str ) < SZ )

strcat ( str. s2.str ); eise

cout « "\пПереполнение!":

}

}:

Illllllllllllllllllllllllllllllllllllllllltllllllllllllllll int main ( ) t

String sl ( "С Новым годом! " ); II конструктор с одним параметром String s2 = "С новым счастьем!": // аналогично, но в другой форме Массивы строк 295

String s3:

I! конструктор без параметров

cout « "\nsl=": si.display ( ); // показываем все строки cout « "\ns2=": s2.display ( ): cout « "\ns3-": s3.display ( ):

s3 = si:

cout « "\ns3=": s3.display ( );

// присвоение

s3.concat ( s2 );

cout « "\ns3=": s3.display ( ):

cout « endl;

// сложение

return 0;

Класс String содержит массив типа char. Может показаться, что наш заново определенный класс — это то же самое, что и определение строки: массив типа char. Но, поместив массив в класс, мы получили некоторую выгоду. Так как объекту может быть присвоено значение другого объекта того же класса, используя операцию =, то мы можем использовать выражения типа

как мы сделали в функции main (), для установки одного объекта класса String равным другому объекту. Мы можем также определить наши собственные методы для работы с объектами класса String.

В программе STROBJ все строки имеют одинаковую длину: SZ символов (SZ установлено равным 80). В ней есть два конструктора. В первом начальный символ в str устанавливается равным '\0', чтобы длина строки была равной 0. Этот конструктор вызывается в строке

Второй конструктор присваивает объекту класса String значение строковой константы. Он использует библиотечную функцию strcpyO Для копирования строковой константы в переменную объекта. Конструктор вызывается в строке

String si ( "С Новым годом! " ):

Альтернативный формат вызова этого конструктора, работающий с любым одноаргументным конструктором, будет таким

String si = "С Новым годом! ":

Какой бы формат вы ни использовали, этот конструктор эффективно преобразует строковый тип в объект класса String, то есть обычную строковую константу в объект. Метод displayO выводит строку объекта на экран.

Другой метод нашего класса String, concat(), объединяет один объект класса String с другим (складывает две строки). Первоначальный объект вызывает метод, то есть к его строке будет добавлена строка объекта, переданного в качестве аргумента. Таким образом, строка функции main() s3.concat ( s2 );

s3 = si:

String s3: 296 Глава 7. Массивы и строки

служит для прибавления строки s2 к уже существующей строке s3. Так как s2 инициализирована как «С новым счастьем!», а S3 было присвоено значение si, «С Новым годом!», то в результате значением s3 будет «С Новым годом! С новым счастьем!»

Метод concatQ использует библиотечную функцию языка С strcat() для выполнения объединения строк. Эта библиотечная функция присоединяет строку второго аргумента к строке первого аргумента. Вывод программы будет таким:

Sl=C Новым годом!
Предыдущая << 1 .. 105 106 107 108 109 110 < 111 > 112 113 114 115 116 117 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100