Программирование >>  Инициализация объектов класса, структура 

1 ... 220 221 222 [ 223 ] 224 225 226 ... 395


class NoName {

public:

здесь должны быть конструкторы

...

protected:

char *pstring; int ival;

double dval;

Объясните свой выбор: Упражнение 14.3

Выберите одну из следующих абстракций (или предложите свою собственную). Решите, какие данные (задаваемые пользователем) подходят для представляющего эту абстракцию класса. Напишите соответствующий набор конструкторов. Объясните свое решение.

Книга

Дата

Служащий

Транспортное средство

Объект

Дерево Упражнение 14.4

Пользуясь приведенным определением класса:

определение acct2 считается ошибкой. В случае, когда копирующий конструктор не объявлен, выполняется почленная инициализация по умолчанию. Если впоследствии объявление копирующего конструктора будет добавлено или удалено, никаких изменений в программе! пользователей вносить не придется. Однако перекомпилировать их все же необходимо. (Более подробно почленная инициализация рассматривается в разделе 14.6.)

Упражнение 14.1

Какие из следующих утверждений ложны? Почему?

1. У класса должен быть хотя бы один конструктор.

2. Конструктор по умолчанию - это конструктор с пустым списком параметров.

3. Если разумных начальных значений у членов класса нет, то не следует предоставлять конструктор по умолчанию.

4. Если в классе нет конструктора по умолчанию, то компилятор генерирует его автоматически и инициализирует каждый член значением по умолчанию для соответствующего типа.

Упражнение 14.2

Предложите один или несколько конструкторов для данного множества членов.



class Account { public:

7\оо

Account();

explicit Account( const char*, double=0.0 );

(a) Account acct;

(b) Account acc±2 = acct;

(c) Account acct3 = Rena Stern ;

(d) Account acc±4( Anna Engel , 400.00 );

объясните, что происходит в результате следующих определений:

(e) Account acct5 = Account( acct3 );

Упражнение 14.5

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

Account::Account( const Account rhs );

14.3. Деструктор класса

Одна из целей, стоящих перед конструктором, - обеспечить автоматическое выделение ресурса. М1 уже видели в примере с классом Account конструктор, где с помощью оператора new выделяется память для массива символов и присваивается уникальный номер счету. Можно также представить ситуацию, когда нужно получить монопольный доступ к разделяемой памяти или к критической секции потока. Для этого необходима симметричная операция, обеспечивающая автоматическое освобождение памяти или возврат ресурса но завершении времени жизни объекта, - деструктор. Деструктор - это специальная определяемая пользователем функция-член, которая автоматически вызывается, когда объект выходит из области видимости или когда к указателю на объект применяется операция delete. Имя этой функции образовано из имени класса с предшествующим символом тильда (~). Деструктор не возвращает значения и не принимает никаких параметров, а следовательно, не может быть перегружен. Хотя разрешается определять несколько таких функций-членов, лишь одна из них будет применяться ко всем объектам класса. Вот, например, деструктор для нашего класса Account:



class Account { public:

Account();

explicit Account( const char*, double=0.0 );

count();

private:

Account( const Accounts ~Account();

...

char * name;

unsigned int acct nmbr; double balance;

inline

Account::~Account()

delete [] name;

return acct number( acct nnmbr );

inline

Account::~Account()

необходимо delete [] name;

return acct number( acct nnmbr ); необязательно name = 0; balance = 0.0; acct nmbr = 0;

Обратите внимание, что в нашем деструкторе не сбрасываются значения членов:

Делать это необязательно, поскольку отведенная под члены объекта память все равно

class Point3d { public:

...

private:

float x, y, z;

будет освобождена. Рассмотрим следующий класс: };

Конструктор здесь необходим для инициализации членов, представляющих координаты точки. Нужен ли деструктор? Нет. Для объекта класса Point3d не требуется освобождать ресурсы: память выделяется и освобождается компилятором автоматически в начале и в конце его жизни.

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



1 ... 220 221 222 [ 223 ] 224 225 226 ... 395

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