|
Программирование >> Дополнительные возможности наследования
delete [] itsString; itsLen = 0; cout \ tString destructor\ n ; этот оператор освобождает память, а затем копирует строку и размер Strings. String: :operator=(const String & rhs) if (this == &rhs) return *this; delete [] itsString; itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (int 1 = 0; KitsLen; i++) itsString[i] = rhs[i]; itsString[itsLen] = \ 0; return *this; cout Л tString operator=\ n ; неконстантный оператор индексирования, возвращает ссылку на символ, который можно изменить! char & String::operator[](int offset) { if (offset > itsLen) return itsString[itsLen-1]; else return itsString[offset]; константный оператор индексирования, используется для константных объектов (см. конструктор-копировщик!) char String::operator[](int offset) const if (offset > itsLen) return itsString[itsLen-1]; else return itsString[offset]; создает новый обьект String, добавляя текущий объект к rhs String String: :operator+(const Strings, rhs) int totalLen = itsLen + rhs.GetLen(); String temp(totalLen); int i, j; for (1 = 0; KitsLen: i++) temp[i] = itsString[i]; 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: for (j = О, i = itsLen; temp[i] = rhs[]]; temp[totalLen]=\ 0; return temp; ]<rhs.GetLen(); i++) создает новый объект String из двух объектов класса String String operator+(const String& Ihs, const String* rhs) { int totalLen = Ihs.GetLenO + rhs. GetLen(); String temp(totalLen); int i, j; for (i = 0; i<lhs.GetLen(); i++) temp[i] = lhs[i]; for (J = 0, i = Ihs.GetLenO;; j <rhs. GetLen(); ]++, temp[i] = rhs[j]; temp[totalLen]=\ 0 ; return temp; 1++) int main() String siCString One ); String s2CString Two ); char Cl = { C-String One String s3; String s4 String s5 cout si: cout s2: cout c1: s3 = si + s2; cout s3: s4 = si + c1; cout s4: s5 = c1 + s2; cout s5: return 0; Sl.GetStringO endl; s2.GetStringO endl; << c1 << endl; s3,GetStringO endl s4,GetStringO endl << s5.GetStringO endl si s2 c1 s3 s4 s5 String One String Two C-String One String One String Two String One C-String One C-String One String Two Объявления всех методов класса String, за исключением operator+, остались такими же, как в листинге 15.1. В строке 20 листинга 15.8 перегружается новый operator+, который принимает две ссылки на константные строки и возвращает строку, полученную в результате конкатенации исходных строк. Эта функция объявлена как друг класса String. Обратите внимание, что функция operator+ не является функцией-членом этого или любого другого класса. Она объявляется среди функций-членов класса string как друг, но не как член класса. Тем не менее это все же полноценное объявление функции, и нет необходимости еще раз объявлять в программе прототип этой функции. Выполнение функции operateг+ определяется в строках 142-153. Определение выполнения функции аналогично приведенному в версии программы, представленной в листинге 15.1, за тем исключением что функция принимает в качестве аргументов две строки, обращаясь к ними с помощью открытых методов доступа класса. Перегруженный оператор применяется в строке 171, где выполняется конкатенация двух строк. Функцнн-дрдзья Для объявления функции как друга класса используется ключевое слово friend, за которым следует объявление функции. Это не предоставляет функции доступ к указателю this, но обеспечивает доступ ко всем закрытым и защищенным данным и функциям-членам. Пример: ClassРа:rtNofle- f;j;.;f -уУ-уГ- у/. Ш f ::§№ , :Сйела класса цругм. этого класса J; ,f rilend-ypidcPartsL :у:у¥:.у: ШуФ., уу :: .: сделаЫ другом Глобальнуюфункцию friend int SoraeFunctionO; /-у-- ; :. у)у.. У--у Перегрузка оператора вывоуа Настало время снабдить наш класс String возможностью использовать объект cout для вывода своих данных так же, как при выводе данных базовых типов. До сих пор для вывода значения переменной-члена приходилось использовать следующее выражение: cout << theString.GetStringO; Неплохо было бы иметь возможность написать просто cout << theString; Для этого необходимо перегрузить функцию operator<<(). Более подробно использование потоков iostreams для вывода данных обсуждается на занятии 16. А в листинге 15.9 объявляется перегрузка функции operator<< как друга.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |