Компилятор сообщает, что он не может найти конструктор student: : Student (). Добавив конструктор по умолчанию, можно решить эту проблему: class Student { public: Student(char *pName|; Studentf); }; int main(int argcs, char* pArgs[]) { Student noName; return 0; } Это пример нелогичности, поясняющий, за что программистам на C++ платят большие деньги. /&>н&п/и/и/го#ание членов класса В предыдущих примерах использовались данные-члены простых типов, такие, как float или int. Переменные таких простых типов легко инициализировать, передав необходимое значение конструктору. Но что, если класс содержит данныечлены, которые являются объектами других классов? <strong>Р</strong>ассмотрим приведенный ниже пример. #include #include int nextStudentld = 0; class Studentld ( public: Studentld() { value = +rnextStudent!d; coat
} Student s("Randy"); return 0; В момент создания объекту типа student присваивается собственный идентификатор. В данном примере идентификаторы "раздаются" последовательно, с помощью глобальной переменной nextStudent 13. Наш класс Student содержит член id. который является экземпляром класса Student ID. Конструктор класса Student не может присвоить значение члену id, поскольку Student не имеет доступа к защищенным членам класса St.uder.tlD. Можно было бы сделать student другом класса SLudentlo, но такой подход нарушил бы положение объектно-ориентированного программирования, утверждающее, что каждый класс должен заниматься своим делом. Нам нужна возможность вызывать конструктор класса StudentiD в процессе создания класса Student. C++ делает это автоматически, инициализируя член id с помощью конструктора по умолчанию StudentiD: : StudentiD (). Это происходит после вызова конструктора класса Student, но до того, как управление передается первой строке этого конструктора. (Выполните в пошаговом режиме приведенную выше программу, и вы поймете, о чем я говорю. Только не забудьте при компиляции включить опцию Outline inline functions.) Выполнение приведенной выше программы выведет на экран следующие строки: Присваиваем студенту идентификатор 1 Создаем студента Randy Обратите внимание: сообщение от конструктора StudentiD появилось раньше, чем сообщение от конструктора Student. (Поскольку у нас все конструкторы выполняют вывод на экран, вы можете решить, что они всегда должны поступать подобным образом. На самом деле подавляющее большинство конструкторов работают "молча".) Если программист не обеспечит свой класс конструктором, то конструктор по умолчанию, созданный C++, вызовет конструкторы всех данных-членов для их инициализации. То же касается и уничтожения объекта. Деструктор класса автоматически вызывает деструкторы всех данных-членов (которые, само собой, его имеют). Теперь мы знаем, что будет с конструктором по умолчанию. Но что, если мы захотим вызвать другой конструктор? Куда в этом случае нужно поместить объект? Вот что я имею в виду: представьте себе, что вместо автоматической генерации идентификатора студента, необходимо передать его конструктору student с тем, чтобы он, в свою очередь, передал его конструктору stuaen_iD. <strong>Для</strong> начала я покажу вам способ, который работать не будет. #include #include class Student Id { public: Studentld(int id = 0) { value = id; сout
- Page 3 and 4:
y Stephen R. Davis IDG BOOKS WORLDW
- Page 5 and 6:
ББК32.973.26-018.2 я 75 Д94 У
- Page 7 and 8:
Содержание Об авто
- Page 9 and 10:
Сравнение указател
- Page 11 and 12:
Работа с деструкто
- Page 13 and 14:
Моим друзьям и семь
- Page 15 and 16:
Введение 0
- Page 17 and 18:
В предыдущем издан
- Page 19 and 20:
использованные в э/
- Page 21 and 22:
В э/ной наани... И но
- Page 23 and 24:
Язык С оказался дей
- Page 25 and 26:
ше использовать им
- Page 27 and 28:
Таким многословным
- Page 29 and 30:
Оформленные таким
- Page 31 and 32:
как результата выч
- Page 33 and 34:
Объявление /газных
- Page 35 and 36:
Начиная с этой стро
- Page 37 and 38:
объявление перемен
- Page 39 and 40:
Эти символы помога
- Page 41 and 42:
Окончание табл. 3.1 П
- Page 43 and 44:
выполнение tjHafutMX оп
- Page 45 and 46:
Глава 4 Выполнение
- Page 47 and 48:
как соотношения ме
- Page 49 and 50:
Другие системы счи
- Page 51 and 52:
Оператор & определя
- Page 53 and 54:
Зачем придуманы эт
- Page 55 and 56:
2-я последовательно
- Page 57 and 58:
} return 0; Программа whil
- Page 59 and 60:
ной цикла. Условие
- Page 61 and 62:
Но... ничто не вечно
- Page 63 and 64:
Вложенные команды
- Page 65 and 66:
\ case 3: //' обработка с
- Page 67 and 68:
В э&ои час&и... Выпол
- Page 69 and 70:
Согласно синтаксис
- Page 71 and 72:
И аргументы, и возв
- Page 73 and 74:
} cout « "Эта программ
- Page 75 and 76:
Такие аналогии меж
- Page 77 and 78:
} int localVariable; static int sta
- Page 79:
С помощью массивов
- Page 82 and 83:
Выход за границы ма
- Page 84 and 85:
f or i int i = 0 ; i< sizeOfloat. A
- Page 86 and 87:
cout
- Page 88 and 89:
Обработка символов
- Page 90 and 91:
расположении перем
- Page 92 and 93:
Теперь используем
- Page 94 and 95:
*pintvar = 100. С не вызыв
- Page 96 and 97:
эта переменная дос
- Page 98 and 99:
сохранение значени
- Page 100 and 101:
Повторное знакомст
- Page 102 and 103:
Использование указ
- Page 104 and 105:
заканчивается полу
- Page 106 and 107:
} charArrayflO] - 'О'; * (charArra
- Page 108 and 109:
case 1: pszReturnValue = "Янва
- Page 110 and 111:
Глава 10 Прочие функ
- Page 112 and 113:
накопление последо
- Page 114 and 115:
Создание модуля MainM
- Page 116 and 117:
7. Выберите пункт ме
- Page 118 and 119:
Глава 11 Отладка про
- Page 120 and 121:
: с: \wiNNT\System32\command.com -
- Page 122 and 123:
ошибка находится в
- Page 124 and 125:
Введите следующее
- Page 126 and 127:
Таблица 11.1. Команды
- Page 128 and 129:
мую команду. (Испол
- Page 130 and 131:
Теперь достоверно
- Page 132 and 133:
! f _cSfc/*№it*le E File Edit t 1
- Page 134 and 135:
void init(unsigneds accountNumber,
- Page 136 and 137:
Чтобы продемонстри
- Page 138 and 139:
Часть III "Классичес
- Page 140 and 141:
Глава 12 Знакомство
- Page 142 and 143: Люди склонны заним
- Page 144 and 145: После ключевого сл
- Page 146 and 147: cin >> nds.firstName; if (stricmp(n
- Page 148 and 149: Глава 14 Работа с кл
- Page 150 and 151: Микроволновая печь
- Page 152 and 153: Student s; void fn(void) { //это
- Page 154 and 155: Объект, для которог
- Page 156 and 157: добавляем новый ку
- Page 158 and 159: }; float grade () ; //...прочи
- Page 160 and 161: invariable; //объявление
- Page 162 and 163: eturn 0; Теперь "ps вычи
- Page 164 and 165: #include #include class Student {
- Page 166 and 167: Возв[гшн к tct/че Про
- Page 168 and 169: Другие операции на
- Page 170 and 171: } // указывать на вст
- Page 172 and 173: Глава 16 Защищенные
- Page 174 and 175: } //повысим свой рей
- Page 176 and 177: эта функция — друг
- Page 178 and 179: Глава 17 Создание и
- Page 180 and 181: Однако, как уже отм
- Page 182 and 183: В одной строке може
- Page 184 and 185: Работа с деструкто
- Page 186 and 187: Глава 18 Аргументац
- Page 188 and 189: int main(int argcs, char* pArgs[])
- Page 190 and 191: } Student freshMan("Smell E. fish")
- Page 194 and 195: protected: int value class Student
- Page 196 and 197: С точки зрения прив
- Page 198 and 199: При отладке такой п
- Page 200 and 201: Глава 19 Копирующий
- Page 202 and 203: } cout
- Page 204 and 205: Создаем нового сту
- Page 206 and 207: Для решения указан
- Page 208 and 209: } // временный объек
- Page 210 and 211: Глава 20 Статически
- Page 212 and 213: noOfStudents++; //обращени
- Page 214 and 215: class Student { public: static int
- Page 216 and 217: Что такое this Я уже у
- Page 219 and 220: функция display — отоб
- Page 221 and 222: for (int j=0; j < noSvgAccounts; j-
- Page 223 and 224: Сумма по сберегате
- Page 225 and 226: В э*яой чаани... Из д
- Page 227 and 228: кода. Представьте с
- Page 229 and 230: public: int qualifier( > { return q
- Page 231 and 232: sor. Однако вы можете
- Page 233 and 234: int main (int argcs, char* pArgs[])
- Page 235 and 236: Зачем нужен полимо
- Page 237 and 238: #include class Base public: virtua
- Page 239 and 240: сначала выключить
- Page 241 and 242: Единственное отлич
- Page 243 and 244:
к классу дополните
- Page 245 and 246:
Checking I withdrawal!) 1 i — 1 d
- Page 247 and 248:
унаследуют эти изм
- Page 249 and 250:
Концепция абстракт
- Page 251 and 252:
virtual void write(char *pString);
- Page 253 and 254:
pAcc->withdrawal(100.OOf); //это
- Page 255 and 256:
BUDGET3.CPP — Программа
- Page 257 and 258:
Account* next() } return (Account*)
- Page 259 and 260:
if (++noWithdrawals > 1) { balance
- Page 261 and 262:
Введите номер счет
- Page 263 and 264:
сконцентрироватьс
- Page 265 and 266:
в э&ой чхшпи... В это
- Page 267 and 268:
Я осознаю, что это с
- Page 269 and 270:
int main(int argcs, char* pArgs[ US
- Page 271 and 272:
} return si; Проблема в т
- Page 273 and 274:
Oneficwiofibi как функции
- Page 275 and 276:
...тело функции здес
- Page 277 and 278:
Распространенная о
- Page 279 and 280:
Если потребуется в
- Page 281 and 282:
Копирующий констру
- Page 283 and 284:
Класс Name содержит р
- Page 285 and 286:
оператор присвоени
- Page 287 and 288:
Время вводить новы
- Page 289 and 290:
Первый аргумент эт
- Page 291 and 292:
Функция открывает
- Page 293 and 294:
i cout
- Page 295 and 296:
Написание сода&вен
- Page 297 and 298:
Заметьте, что эта ф
- Page 299 and 300:
редается объект uSDol
- Page 301 and 302:
try { // Эта строка ген
- Page 303 and 304:
управление перелае
- Page 305 and 306:
filetsizeof file - 1] = 'NO'; lineN
- Page 307 and 308:
Глава 28 Множествен
- Page 309 and 310:
Ответ прост: оба. Кл
- Page 311 and 312:
М-да... "Не говори "го
- Page 313 and 314:
void fn() SleeperSofa ss; cout « "
- Page 315 and 316:
Указатели рВ1 и рВ2
- Page 317 and 318:
S э&ой чаани,.. Ни одн
- Page 319 and 320:
Умный компилятор (т
- Page 321 and 322:
МомменйифциЖе свою
- Page 323 and 324:
Приложение А Слова
- Page 325 and 326:
Полиморфизм Порожд
- Page 328 and 329:
цказсиОель --, 36; 42 !,
- Page 330 and 331:
Оператор присвоени
- Page 332 and 333:
ПРОГРАММИРОВАНИЯ Д
- Page 334 and 335:
»лия ПОЛЬЗОВАТЕЛЯ
- Page 336 and 337:
ерия компьютерных