|
Программирование >> Инициализация объектов класса, структура
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 ); третий элемент (Тигра) Один аргумент можно задать явно, как в примере выше. Если же необходимо передать
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |