|
Программирование >> Структурное программирование
Глава 7 rj* EMPLOYl.CPP II Определения функций-элементов класса Employee tinclude <iostream.h> tinclude <string.h> tinclude <assert.h> tinclude employl.h Задание начального значения элемента данных int Employee::count = 0; Определение статической функции-элемента, которая возвращает количество созданных объектов, int Employee::getCountО { return count; } Конструктор динамически выделяет память для имени и фамилии и использует strcpy, чтобы скопировать имя и фамилию в объект. Employee::Employee(const char *first, const char *last) { firstName = new char[ strlen (first) + 1 ]; assert(firstName != 0); проверка выделения памяти strcpy(firstName, first); lastName = new char[ strlen(last) + 1 ]; assert(lastName != 0); проверка выделения памяти strcpy(lastName, last); ++count; увеличение статического счетчика служащих cout << Конструктор Employee для << firstName lastName вызван. endl; Деструктор освобождает динамически выделенную память Employee::~Employee() cout << ~Employee() вызван для << firstName << lastName endl; delete [ ] firstName; освобождение памяти delete [ ] lastName; освобождение памяти -count; уменьшение статического счетчика служащих Возвращение имени служащего const char *Employee:igetFirstNameО const Const перед возвращаемым типом предотвращает изменение клиентом закрытых данных. Клиент должен скопировать возвращенную строку перед тем, как деструктор освободит динамическую память; это позволит избежать неопределенного указателя, return firstName; Рис. 7.9. Использование статического элемента данных для подсчета количества объектов класса (часть 2 из 5) Рис. 7.9. Использование статического элемента данных для подсчета количества объектов класса (часть 3 из 5) FIG7 9.CPP Драйвер для проверки класса employee tinclude <iostream.h> tinclude employl.h main () cout << Количество служащих перед созданием объектов равно Employee::getCount() endl; используется имя класса Employee *elPtr = new Employee( Susan , Baker ); Employee *e2Ptr = new Employee( Robert , Jones ); cout << Количество служащих после создания объектов равно elPtr->getCount() endl; cout endl << Служащий 1: elPtr->getFirstNameО elPtr->getLastName() << endl << Служащий 2: << e2Ptr->getFirstName() e2Ptr->getLastName0 << endl endl; delete elPtr; освобождение памяти delete e2Ptr; освобождение памяти cout << Количество служащих после удаления равно << Employee::getCount() << endl; return 0; I } Рис. 7.9. Использование статического элемента данных для подсчета количества объектов класса (часть 4 из 5) Функция-элемент тоже может быть объявлена как static, если она не должна иметь доступ к нестатическим элементам класса. В отличие от нестатических функций-элементов статическая функция-элемент не имеет указателя this, потому что статические данные-элементы и статические функции-элементы суш;ествуют независимо от каких-либо объектов класса. i EMPLOYl.CPP: Продолжение Возвращение фамилии служащего const char *Employee::getLastName() const Const перед возвращаемым типом предотвращает изменение клиентом закрытых данных. Клиент должен скопировать возвращенную строку перед тем, как деструктор освободит динамическую память; это позволит избежать неопределенного указателя, return lastName; Количество служащих перед созданием объектов равно О Щ Конструктор Employee для Susan Baker вызван. Конструктор Employee для Robert Jones вызван. Количество служащих после создания объектов равно 2 Служащий 1: Susan Baker Служазций 2: Robert Jones ~Employee() вызван для Susan Baker ~Employee() вызван для Robert Jones Количество служащих после удаления равно О Рис. 7.9. Использование статического элемента данных для подсчета количества объектов класса (часть 5 из 5) Отметим использование assert в функции конструкторе Employee, функции getPirstName и функции getLastName. Утилита assert, определенная в заголовочном файле assert.h, проверяет значение выражения. Если значение выражения равно О (ложь), то assert печатает сообщение об ошибке и вызывает функцию abort (из общей библиотеки утилит - stdlib.h), которая завершает выполнение программы. Это полезное отладочное средство для проверки, имеет ли переменная правильное значение. В этой программе assert определяет, способна ли операция new осуществить динамическое выделение необходимого объема памяти. Например, в функции конструкторе Employee следующая строка (называемая также оператором контроля) assert{firstName !=0); проверяет указатель firstName, чтобы определить, не равен ли он О. Если условие в операторе контроля истинно, то программа продолжается без прерывания. Если же это условие ложно, то выдается сообщение об ошибке, содержащее номер строки, проверяемое условие, печатается имя файла, в котором проявил себя оператор контроля, и программа завершается. Программист может сосредоточить свое внимание на этой части кода, чтобы найти причину ошибки. В главе 13 Обработка исключений мы узнаем более совершенные методы работы с ошибками во время выполнения. Операторы контроля не надо удалять из программы после окончания отладки. Когда операторы контроля больше не нужны для отладки программы, в начале файла программы вставляется строка ttdefine NDEBUG Это приводит к тому, что препроцессор игнорирует все операторы контроля, что удобнее, чем удалять каждый такой оператора контроля вручную. Типичная ошибка программирования 7.9 Ссылка на указатель this внутри аатической функции-элемента. Типичная ошибка программирования 7.10 Объявление статической функции-элемента как const. Замечание по технике программирования 7.7 Статические данные-элементы и статические функции-элементы существуют и могут быть использованы, даже если не создано никаких объектов соответствующего класса.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |