Программирование >>  Структурное программирование 

1 ... 160 161 162 [ 163 ] 164 165 166 ... 342


Глава 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

Статические данные-элементы и статические функции-элементы существуют и могут быть использованы, даже если не создано никаких объектов соответствующего класса.



1 ... 160 161 162 [ 163 ] 164 165 166 ... 342

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