|
Программирование >> Дополнительные возможности наследования
12 13 14 15 strncpy(String2,Stringi,MaxLength); oout Stringi: Stringi << endl; oout Strlng2; String2 endl; return 0; } Stringi: No man is an island String2: No man is an island В строке 10 программа вместо функции stropyO используется функцию strncpyO, третий параметр MaxLength которой задает максимальную длину копируемой строки. Размер массива String2 задан как MaxLength+l. Дополнительный элемент потребовался для концевого нулевого символа строки, который добавляется автоматически обеими функциями - stropyO и strncpyO. Классы строк Многие компиляторы С++ содержат библиотеки классов, с помощью которых можно рещать различные прикладные задачи. Одним из представителей встроенных классов является класс String. Язык С++ унаследовал от С концевой нулевой символ окончания строки и библиотеку строковых функций, куда входит функция StropyO. Но все эти функции нельзя использовать в объектно-ориентированном программировании. Класс String предлагает набор встроенных функций-членов и переменных-членов, а также методов доступа, которые позволяют автоматически рещать многие задачи, связанные с обработкой текстовых строк, получая команды от пользователя. Если в ващем компиляторе нет встроенного класса String, а иногда и в тех случаях, когда он есть, бывает необходимо создать собственный класс работы со строками. Далее в этой главе рассматривается процедура создания и применения класса String и пользовательских классов работы со строками. Как минимум, класс String должен преодолеть Офаничения, свойственные использованию массивов символов. Подобно другим массивам, массивы символов статичны. Вам приходится задавать их размер при объявлении или инициализации. Они всегда занимают все отведенное для них пространство памяти, даже если вы используете только половину элементов массива. Запись данных за пределы массива ведет к катастрофе. Хорощо написанный класс работы со строковыми данными вьщеляет столько памяти, сколько необходимо для текущего сеанса работы с профаммой, и всегда предусматривает возможность добавления новых данных. Если с вьщелением дополнительной памяти возникнут проблемы, предусмотрены элегантные пути их решения. Первый пример использования класса String показан в листинге 12.12. йнсшииг 12.12. Испойьзованне кйасса string Листинг. 12.12 (tinolude <iostream.h> ((Include <string.h> 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 Перегруженные операторы char & operator[](unsigned short offset), char operator[](unsigned short offset) const. String operator+(oonst String&), void operator+=(oonst String&) String & operator= (const String &), Основные методы доступа unsigned short GetLen()const { return itsLen, } const char * GetStringO const { return itsString, } private String (unsigned short), Закрытый конструктор char * itsString, unsigned short itsLen Конструктор, заданный no умолчанию, создает строку нулевой длины String StringO ItsString = new char[1] itsString[0] = \ 0 , itsLen=0, Закрытый (вспомогательный) конструктор используется только методами класса для создания отрок требуемой длины с нулевым наполнением String String(unsigned short len) ItsString = new char[len+1] for (unsigned short i = 0 i<=len, i++) itsString[i] = \ 0 , itsLen=len, Преобразование массива символов в строку String String(const char const cString) { 6: Рудиментарный класс string 7: class String 8: { 9: public Конструкторы StringO String(oonst char *oonst) String(oonst String &), StringO 55: itsLen = strlen(cString); 56: itsString = new char[itsLen+1]; 57: for (unsigned short i = 0; i<itsLen; 58: ltsString[i] = cString[l]: 59: itsString[itsLen]=\ 0; 60: } 62: Конструктор-копировщик 63: String::String (const String & rhs) 64: { 65: itsLen=rhs.GetLen(); 66: itsString = new char[itsLen+1]; 67: for (unsigned short i = 0; i<itsLen;i++) 68: itsString[i] = rhs[i]; 69: ltsString[itsLen] = \ 0; 70: } 72: Деструктор для освобождения памяти 73: String:: String () 74: { 75: delete [] itsString; 76: itsLen = 0; 77: } 78: 79: Оператор присваивания освобождает память 80: и копирует туда string и size 81: Strings String::operator=(const String & rhs) 82: { 83: if (this == &rhs) 84: return *this; 85: delete [] itsString; 86: itsLen=rhs.GetLen(); 87: itsString = new char[itsLen+1]; 88: for (unsigned short i = 0; i<itsLen;i++) 89: itsString[i] = rhs[i]; 90: itsString[itsLen] = ДО; 91: return *this; 92: } 94: неконстантный оператор индексирования 95: возвращает ссылку на символ так, что его 96: можно изменить! 97: char & String::operator[](unsigned short offset) 98: { 99: if (offset > itsLen) 100: return itsString[itsLen-1]; 101: else 102: return itsString[offset]; 103: } 104:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |