Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

92: String::~String

93: {

94: ASSERT(Invariants);

95: delete [] itsString;

96: itsLen = 0;

97: }

96:

99: // оператор выполняет сравнение, освобождает занятую

100: // память, а затем копирует строку и ее размер

101: String& String::operator=(const String & rhs)

102: {

103: ASSERT(Invariants);

104: if (this == &rhs)

105: return *this;

106: delete [] itsString;

107: itsLen=rhs,GetLen;

108: itsString = new char[itsLen+1];

109: for (int i = 0; i<itsLen;i++)

110: itsString[i] = rhs[i];

111: itsString[itsLen] = '\0';

112: ASSERT(Invariants);

113: return *this;

114: }

115:

116: //

неконстантный оператор индексирования

117: char & String::operator[](int offset)

118: {

119: ASSERT(Invariants);

120: if (offset > itsLen)

121: {

122: ASSERT(Invariants);

123: return itsString[itsLen-1];

124: }

125: else

126: {

127: ASSERT(Invariants);

128: return itsString[offset];

129: }

130: }

131: // константный оператор индексирования

132: char String::operator[](int offset) const

133: {

134: ASSERT(Invariants);

135: char retVal;

136: if (offset > itsLen)

137: retVal = itsString[itsLen-1];

138: else

139: retVal = itsString[offset];

140: ASSERT(Invariants);

141: return retVal;

142: }

143: bool String::Invariants const

144: {

145: #ifdef SHOW_INVARIANTS

146: cout << "Invariants Tested";

147: #endif

148: return ( (itsLen && itsString) ||

149: (!itsLen && !itsString) );

150: }

151: class Animal

152: {

153: public:

154: Animal:itsAge(1),itsName("John Q. Animal")

155: { ASSERT(Invariants);}

156: Animal(int, const String&);

157: ~Animal{ }

158: int GetAge { ASSERT(Invariants); return itsAge;}

159: void SetAge(int Age)

160: {

161: ASSERT(Invariants);

162: itsAge = Age;

163: ASSERT(Invariants);

164: }

165: String& GetName

166: {

167: ASSERT(Invariants);

168: return itsName;

169: }

170: void SetName(const String& name)

171: {

172: ASSERT(Invariants);

173: itsName = name;

174: ASSERT(Invariants);

175: }

176: bool Invariants;

177: private:

178: int itsAge;

179: String itsName;

180: };

181:

182: Animal::Animal(int age, const String& name):

183: itsAge(age),

184: itsName(name)

185: {

186: ASSERT(Invariants);

187: }

188:

189: bool Animal::Invariants

190: {

191: #ifdef SHOW_INVARIANTS

192: cout << "Invariants Tested";

193: #endif

194: return (itsAge > 0 && itsName.GetLen);

195: }

196:

197: int main

198: {

199: Animal sparky(5, "Sparky");

200: cout << "\n" << sparky.GetName.GetString << " is ";

201: cout << sparky.GetAge << " years old. ";

202: sparky.SetAge(8):

203: cout << "\n" << sparky.GetName. GetString << " is ";

204: cout << sparky.GetAge << " years old. ";

205: return 0;

206: }

Результат:

String OK String OK String OK String OK String OK String OK String OK

String OK String OK Animal OK String OK Animal OK

Sparky is Animal OK 5 years old. Animal OK Animal OK

Animal OK Sparky is Animal OK 8 years old. String OK

Анализ:

В строках 9—15 определяется макрос assert. Если лексема DEBUG определена и макрос assert возвратит в результате операции сравнения значение FALSE, будет выведено сообщение об ошибке.

В строке 39 объявляется функция-член Invariants класса String, а ее определение занимает строки 143—150. Конструктор объявляется в строках 49—55, а в строке 54, после того как объект полностью построен, вызывается функция-член Invariants, чтобы подтвердить правомочность этой конструкции.

Этот алгоритм повторен для других конструкторов, а для деструктора функция- член Invariants вызывается только перед тем, как удалить объект. Остальные методы класса вызывают функцию Invariants перед выполнением любого действия, а затем еще раз перед возвратом из функции. В этом проявляется отличие функций- членов от конструкторов и деструкторов: функции-члены всегда работают с реальными объектами и должны оставить их таковыми по завершению выполнения функции.

В строке 176 класс Animal объявляет собственный метод Invariants, выполняемый в строках 189—195. Обратите внимание на строки 155, 158, 161 и 163: подставляемые функции также могут вызывать метод Invariants.

Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Темный Лекарь 11

Токсик Саша
11. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 11

Ну, здравствуй, перестройка!

Иванов Дмитрий
4. Девяностые
Фантастика:
попаданцы
альтернативная история
6.83
рейтинг книги
Ну, здравствуй, перестройка!

Отмороженный 4.0

Гарцевич Евгений Александрович
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 4.0

Дурашка в столичной академии

Свободина Виктория
Фантастика:
фэнтези
7.80
рейтинг книги
Дурашка в столичной академии

Капитан космического флота

Борчанинов Геннадий
2. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
5.00
рейтинг книги
Капитан космического флота

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Приручитель женщин-монстров. Том 14

Дорничев Дмитрий
14. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Приручитель женщин-монстров. Том 14

Неудержимый. Книга XXIX

Боярский Андрей
29. Неудержимый
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Неудержимый. Книга XXIX

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Маленькая хозяйка большого герцогства

Вера Виктория
2. Герцогиня
Любовные романы:
любовно-фантастические романы
7.80
рейтинг книги
Маленькая хозяйка большого герцогства

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2