|
Программирование >> Структурное программирование
STRING2.H Определение класса String #ifndef STRING1 H #define STRING1 H tinclude <iostream.h> class String { friend ostream &operator<< (ostream S, const String &); friend istream soperator (istream &, String &); public: String(const char * = ); конструктор преобразования String(const String &); конструктор копии -String О; деструктор const String &operator=(const String S); присваивание String &operator+=(const String &); сцепление (конкатенация) String пуст? const; проверка si == s2 const; проверка si != s2 const; проверка si < s2 const; проверка si > s2 const; проверка si >= s2 const; проверка si <= s2 возвращение ссылки на символ возвращение подстроки возвращение длины строки указатель на начало строки длина строки int operator!() const; int operator==(const String &) int operator!=(const String &) int operator<(const String &) int operator>(const String &) int operator>=(const String &) int operator<=(const String &) char soperator[](int); String operator 0 (int, int); int getLengthO const; private: char *sPtr; int length; }; #endif Рис. 8.5. Определение базового класса String (часть 1 из 8) STRING2.CPP Определения функций-элементов класса String tinclude <iostream.h> tinclude <iomanip.h> tinclude <string.h> tinclude <assert.h> tinclude string2.h Конструктор преобразования: преобразовывает char * String::String(const char *s) в String cout Конструктор преобразования: s endl; length = strlen(s); вьмисление длины sPtr = new char[length + 1]; выделение памяти assert(sPtr != 0); завершение, если память не выделена strcpy(sPtr, s); копирование строки аргумента в объект Конструктор копии string::string(const String Scopy) cout Конструктор копии: << copy.sPtr << endl; length = copy.length; копирование длины sPtr = new char[length +1]; выделение памяти assert(sPtr != 0); завершение, если память не выделена strcpy(sPtr, copy.sPtr); копирование строки Деструктор String::-String() ( cout Деструктор: delete [ ] sPtr; sPtr endl; освобождение памяти, отведенной строке Перегруженная операция = ; избегает самоприсваивания const String &String::operator=(const String &right) { cout << вызов operator= endl; if (Sright != this) { проверка самоприсваивания delete [ ] sPtr; предотвращение утечки памяти length = right.length; новая длина String sPtr = new char[length + 1]; выделение памяти assert(sPtr != 0); подтверждение выделения памяти strcpy(sPtr, right.sPtr); копирование строки else cout << Попытка самоприсваивания String << endl; return *this; обеспечивает возможность сцепленных присваиваний Сцепление (конкатенация) правого операнда с данным объектом и сохранение сцепленной строки в этом объекте. String SString::operator+=(const String Sright) { сохранение до возможности удаления новая длина String .] ; I/ выделение памяти завершение, если память не выделена левая часть новой String : правая часть новой String освобождение прежней области памяти char *tempPtr = sPtr; length += right.length; sPtr = new char[length + assert(sPtr != 0); strcpy(sPtr, tempPtr); strcat(sPtr, right.sPtr) delete [ ] tempPtr; return *this; обеспечивает возможность сцепленных вызовов Пуст ли String? int String::operator! О const { return length == 0; } Равен ли этот String правому String? int String::operator== (const String Sright) const { return stremp(sPtr, right.sPtr) == 0; } Этот String неравен правому String? int String::operator!=(const String sright) const { return strcmp(sPtr, right.sPtr) != 0;} Меньше ли этот String правого String? int String::operator<(const String Sright) const { return strcmp(sPtr, right.sPtr) < 0; } Больше ли этот String правого String? int String::operator>(const String Sright) const { return strcmp(sPtr, right.sPtr) > 0; } Больше или равен этот String по сравнению с правым String? int String::operator>=(const String Sright) const { return stremp(sPtr, right.sPtr) >= 0; } Меньше или равен этот String по сравнению с правым String? int String::operator<=(const String Sright) const { return stremp(sPtr, right.sPtr) <= 0; } Возвращение ссьшки на символ в String, char SString::operator[](int subscript) { первая проверка, не находится ли подстрока вне диапазона assert(subscript >= О SS subscript < length); return sPtr[subscript]; создание L-величины Возвращение подстроки, начинающейся с заданного индекса и имеющей длину subLength, как ссьшки на объект String String String::operator О (int index, int subLength) { подтверждение того, что индекс в диапазоне и длина подстроки >= О assert(index >= О SS index < length ss subLength >= 0); . String sub; пустой String определение длины подстроки if ((subLength ==0) (index + subLength > length)) sub.length = length - index + 1; else sub.length = subLength + 1; выделение памяти для подстроки delete sub.sPtr; удаление символа из объекта sub.sPtr = new char[sub.length]; assert(sub.sPtr != 0); подтверждение выделения памяти
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |