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

1 ... 222 223 224 [ 225 ] 226 227 228 ... 395


Account acct( Tina Lee ); int swt;

...

switch( swt ) { case 0:

return; case 1:

что-то сделать return;

case 2:

сделать что-то другое return; и так далее

каждого активного локального объекта. Например, в следующем фрагменте

компилятор подставит деструктор перед каждой инструкцией return. Деструктор класса Account невелик, и затраты времени и памяти на его подстановку тоже малы. В противном случае придется либо объявить деструктор невстроенным, либо реорганизовать программу. В примере выше инструкцию return в каждой метке case можно заменить инструкцией break с тем, чтобы у функции была единственная точка

переписано для обеспечения единственной точки выхода switch( swt ) {

case 0: break; 1:

что-то сделать break;

case 2:

сделать что-то другое

break;

и так далее

case 1:

что-то

единственная точка выхода

выхода:

return;

Упражнение 14.6

Напишите подходящий деструктор для приведенного набора членов класса, среди которых pstring адресует динамически выделенный массив символов:

14.3.2. Опасность увеличения размера программы

Встроенный деструктор может стать причиной непредвиденного увеличения размера программы, поскольку он вставляется в каждой точке выхода внутри функции для



class NoName { public:

~NoName();

private:

char *pstring; int ival;

double dval;

Упражнение 14.7

Необходим ли деструктор для класса, который вы выбрали в упражнении 14.3? Если нет, объясните почему. В противном случае предложите реализацию.

Упражнение 14.8

void mumble( const char *name, fouble balance, char acct type ) {

Account acct;

if ( ! name ) return;

if ( balance <= 99 ) return;

switch( acct type ) { case z: return; case a: case b: return;

...

Сколько раз вызываются деструкторы в следующем фрагменте:

14.4. Массивы и векторы объектов

Массив объектов класса определяется точно так же, как массив элементов встроенного типа. Например:

Account table[ 16 ];

определяет массив из 16 объектов Account. Каждый элемент по очереди инициализируется конструктором по умолчанию. Можно и явно передать конструкторам аргументы внутри заключенного в фигурные скобки списка инициализации массива. Строка:

Account pooh pals[] = { Piglet , Eeyore , Tigger };

определяет массив из трех элементов, инициализируемых конструкторами:



Account pooh pals[] = {

Account( Piglet , 1000.0 ), Account( Eeyore , 1000.0 ),

Account( Tigger , 1000.0 ) несколько аргументов, то придется воспользоваться явным вызовом конструктора:

Чтобы включить в список инициализации массива конструктор по умолчанию, м1

Account pooh pals[] = {

Account( Woozle , 10.0 ), Бука

Account( Heffalump , 10.0 ), Слонопотам

Account();

употребляем явный вызов с пустым списком параметров:

Account pooh pals[3] = {

Account( Woozle , 10.0 ),

Account( Heffalump , 10.0 )

Эквивалентный массив из трех элементов можно объявить и так: };

Таким образом, члены списка инициализации последовательно используются для заполнения очередного элемента массива. Те элементы, для которых явные аргументы не заданы, инициализируются конструктором по умолчанию. Если его нет, то в списке должны быть заданы аргументы конструктора для каждого элемента массива.

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

pooh pals[0]; обращается к Piglet, а

pooh pals[1];

к Eeyore и т. д. Для доступа к членам объекта, находящегося в некотором элементе массива, мы сочетаем операторы взятия индекса и доступа к членам:

pooh pals[1]. name != pooh pals[2]. name;

Account( Piglet , 0.0 ); перв элемент (Пятачок) Account( Eeyore , 0.0 ); второй элемент (Иа-Иа)

Account( Tigger , 0.0 ); третий элемент (Тигра)

Один аргумент можно задать явно, как в примере выше. Если же необходимо передать



1 ... 222 223 224 [ 225 ] 226 227 228 ... 395

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