Программирование >>  Дополнительные возможности наследования 

1 ... 110 111 112 [ 113 ] 114 115 116 ... 265


105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

константный оператор индексирования для использования с константными объектами (см, конструктор-копировщик!) char String::operator[](unsigned short offset) const {

if (offset > itsLen)

return itsString[itsLen-1]; else

return itsString[offset];

создание новой строки путем добавления

текущей строки к rhs

String String::operator+(const String rhs)

unsigned short totalLen = itsLen + rhs.GetLen(); String temp(totalLen);

unsigned short i; for ( 1= 0; KitsLen; i++)

temp[i] = itsString[i];

for (unsigned short j = 0; ]<rhs.GetLen(); i++)

temp[i] = rhs[j]; temp[totalLen]=\ 0; return temp;

изменяет текущую строку и возвращает void void String::operator+=(const String& rhs) {

unsigned short rhsLen = rhs.GetLen(); unsigned short totalLen = itsLen + rhsLen; String temp(totalLen);

unsigned short i; for (1 = 0; KitsLen; i++) temp[i] = itsString[i];

for (unsigned short j = 0; i<rhs.GetLen(); i++)

temp[i] = rhs[i-itsLen]; temp[totalLen]=\ 0; ♦this = temp;

int mainO {

String sICinitial test );

cout 31 :\ t << s1. GetStringO endl;

char * temp = Hello World ; si = temp;

cout S1:\ t si.GetStringO endl;

char tempTwo[20];



155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

strcpy(tempTwo, ; nice to be here! ); si += tempTwo;

cout tempTwo:\ t tempTwo endl; cout S1;\ t sl.GetStringO endl;

cout S1[4]:\ t Sl[4] endl; s1[4]=o ;

cout S1:\ t Sl.GetStringO endl;

cout S1[999];\ t s1[999] endl;

String s2( Another string ); String S3; s3 = Sl+s2;

cout S3;\ t s3.GetString() endl; String s4;

s4 = Why does this work? ;

cout S4:\ t s4.GetString() endl; return 0; >

SI: initial test SI; Hello world tempTwo; ; nice to be here!

SI: Hello world; nice to be here! S1[4]: 0

SI: Hello World; nice to be here! S1[999]; !

S3; Hello World; nice to be here! Another string S4; Why does this work?

В строках 7-31 объявляется простой класс String. В строках 11-13 объявляются конструктор по умолчанию, конструктор-копировшик и конструк-тор для приема существующей строки с концевым нулевым символом (стиль языка С).

В классе String перегружаются операторы индексирования ([]), суммирования (+) и присваивания с суммой (+=). Оператор индексирования перегружается дважды. Один раз как константная функция, возвращающая значение типа char, а другой - как неконстантная функция, возвращающая указатель на char.

Неконстантная версия оператора используется в выражениях вроде строки 161: SomeString[4]=х;

В результате открывается прямой доступ к любому символу строки. Поскольку возвращается ссылка на символ, функция получает доступ к символу и может изменить его.

Константная версия оператора используется в тех случаях, когда необходимо получить доступ к константному объекту класса String, например при выполнении конструктора-копировщика в строке 63. Обратите внимание, что в этом случае открывается доступ к rhs[i], хотя rhs был объявлен как const String &. К этому объекту невозможно получить доступ, используя неконстантные функции-члены. Поэтому оператор индексирования необходимо перефузить как константный.



Если возвращаемый объект окажется слишком большим, возможно, вам потребуется установить возврат не значения, а константной ссылки на объект. Но поскольку в нашем случае один символ занимает всего один байт, в этом нет необходимости.

Конструктор, заданный по умолчанию, выполняется в строках 33-39. Он создает строку нулевой длины. Общепринято, что в классе String длина строки измеряется без учета концевого нулевого символа. Таким образом, строка, созданная по умолчанию, содержит только концевой нулевой символ.

Конструктор-копировщик выполняется в строках 63-70. Он задает длину новой строки равной длине существующей строки плюс одна ячейка для концевого нулевого символа. Затем конструктор-копировщик копирует существующую строку в новую и добавляет в конце нулевой символ окончания строки.

В строках 53-60 выполняется конструктор, принимающий строку с концевым нулевым символом. Этот конструктор подобен конструктору-копировщику. Длина существующей строки определяется с помощью стандартной функции strlen{) из библиотеки String.

В строке 28 объявляется еще один конструктор, String(unsigned short), как закрытая функция-член. Он бьш добавлен для того, чтобы не допустить создания в классе String строк произвольной длины каким-нибудь другим пользовательским классом. Этот конструктор позволяет создавать строки только внутри класса String в соответствии со сделанными установками, как, например, в строке 131с помощью operator+=. Более подробно этот вопрос рассматривается ниже, при объявлении operator+=.

Конструктор String(unsigned short) заполняет все элементы своего массива символов значениями NULL. Поэтому в цикле for выполняется проверка i<=len, а не i<ien.

Деструктор, выполняемый в строках 73-77, удаляет строку текста, поддерживаемую классом String. Обратите внимание, что за оператором delete следуют квадратные скобки. Если опустить их, то из памяти компьютера будут удалены не все объекты класса, а только первый из них.

Оператор присваивания прежде всего определяет, не соответствуют ли друг другу операнды слева и справа. Если операнды отличаются друг от друга, то текущая строка удаляется, а новая копируется в эту область памяти. Чтобы упростить присвоение, возвращается ссылка на строку, как в следующем примере:

Stringi = String2 = Strings;

Оператор индексирования перефужается дважды. В обоих случаях проверяются фа-ницы массива. Если пользователь попытается возвратить значение из ячейки памяти, находящейся за пределами массива, будет возвращен последний символ массива (len-l).

В строках 117-128 оператор суммирования (+) выполняется как оператор конкатенации. Поэтому допускается создание новой строки из двух строк, как в следующем выражении:

Strings = stringi + String2;

Оператор (+) вычисляет длину новой строки и сохраняет ее во временной строке temp. Эта процедура вовлекает закрытый конструктор, который принимает целочисленный параметр и создает строку, заполненную значениями NULL. Нулевые значения затем замещаются символами двух строк. Первой копируется строка левого операнда (*this), после чего - строка правого операнда (rhs).

Первый цикл for последовательно добавляет в новую строку символы левой строки. Второй цикл for выполняет ту же операцию с правой строкой. Обратите внимание, что счетчик i продолжает отсчет символов новой строки после того, как счетчик j начинает отсчет символов строки rhs.



1 ... 110 111 112 [ 113 ] 114 115 116 ... 265

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