Программирование >>  Структурное программирование 

1 ... 173 174 175 [ 176 ] 177 178 179 ... 342


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); подтверждение выделения памяти



1 ... 173 174 175 [ 176 ] 177 178 179 ... 342

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