Конструктор - копирование - Большая Энциклопедия Нефти и Газа, статья, страница 3
Если из года в год тебе говорят, что ты изменился к лучшему, поневоле задумаешься - а кем же ты был изначально. Законы Мерфи (еще...)

Конструктор - копирование

Cтраница 3


Если конструктор копирования класса не определен, то компилятор генерирует его неявно Конструктор, генерируемый компилятором, инициализирует новый объект, выполняя операцию поэлементного копирования переменных существующего объекта класса, передаваемого как параметр. Соответственно, используя объект того же типа, всегда можно инициализировать его, даже если конструктор копирования в классе не определен.  [31]

В качестве лругого примера MOJKHO измелить программу 4 20 таким образом, чтобы она периодически распечатывала лишь несколько iсерных элементов каисдой очереди и можно было бы отслеживать продвижение очередей лаже тогда когдр они становятся очень большими. Однако, когда очереди будут очень большими, ггроиэно-дитсльностъ программы существенно снизится, поскольку при инициализации локальной переменной ъ UHKJIC for вызыпаетси конструктор копирования, который создает копию йсей очереди, лаже если требуется исего лишь несколько элементов. Однако, если требуется доступ всего лишь к нескольким элементам очереди, нлатигь столь высокую цену было бы неразумно.  [32]

В качестве другого примера можно изменить программу 4.20 таким образом, чтобы она периодически распечатывала лишь несколько первых элементов каждой очереди, и можно было бы отслеживать продвижение очередей даже тогда, когда они становятся очень большими. Однако, когда очереди будут очень большими, производительность программы существенно снизится, поскольку при инициализации локальной переменной в цикле for вызывается конструктор копирования, который создает копию всей очереди, даже если требуется всего лишь несколько элементов. Далее, в конце каждой итерации цикла память, занимаемая очередью, освобождается деструктором, так как она связана с локальной переменной. Для программы 4.20 в ее нынешнем виде, когда выполняется доступ к каждому элементу копии, дополнительные затраты на выделение и освобождение памяти увеличивают время выполнения только на некоторый постоянный коэффициент. Однако, если требуется доступ всего лишь к нескольким элементам очереди, платить столь высокую цену было бы неразумно. Пожалуй, в такой ситуации для операции копировать большее предпочтение стоит отдать реализации, используемой по умолчанию, которая копирует только указатели, и добавить в этот АТД операции, обеспечивающих доступ к элементам очереди без ее модификации.  [33]

Абстрактный тип данных первого класса не применяется в том смысле, как это принималось в разделе 4.8 ( см. упражнение 12.6), поскольку в большинстве программ используется только одна таблица, а добавление конструкторов копирования, перегруженных операций присваивания и деструкторов, хоть и несложная задача в большинстве реализаций, но все же она отвлекала бы от важных характеристик алгоритмов, В программе 12.2 можно было бы также определить версию интерфейса для манипулирования дескрипторами элементов подобно программе 9.8 ( см. упражнение 12.7), но это излишне усложняет программу в типичной ситуации, когда достаточно манипулировать элементом посредством ключа. Интерфейс не задает способ определения элемента, который должен быть удален. В большинстве реализаций используется интерпретация удалить элемент с ключом, равным данному элементу, при этом подразумевается предварительный поиск. В других реализациях, которые предоставляют дескрипторы и могут выполнять проверку идентичности элемента, необходимость поиска перед удалением исключается, и поэтому для них допустимы более быстрые алгоритмы.  [34]

При вызове конструктора класса компилятор из выражения создает временный объект класса. Функция operator непосредственно возвращает содержимое этого временного объекта. Далее, в параграфе Конструкторы копирования, описано, как объекты класса возвращаются функциями.  [35]

Параметр Curr является объектом класса CCurrency. При каждом вызове функции он должен создаваться и инициализироваться с помощью объекта, передаваемого в функцию. Для инициализации параметра компилятор инициализирует вызов конструктора копирования, определенного явно или сгенерированного компилятором.  [36]

Рассмотрим специальные свойства конструкторов, имеющих единственный параметр. Это - конструкторы с дополнительными параметрами и стандартными значениями, которые, следовательно, могут быть вызваны с единственным параметром. Если единственный ( или первый) параметр является ссылкой на тот же тип данных, что и класс, то конструктор называется конструктором копирования. Если же параметр имеет тип, отличающийся от класса конструктора, то такой конструктор называется конструктором преобразования.  [37]

Действительно, в языке C любой класс, обладающий свойством, что ни один из его данных-членов не является указателем, относится к типам данных первого класса. При копировании объекта копируется каждый его член; когда объекту присваивается значение какого-нибудь иного объекта, то каждый его член перезаписывается; когда объект выходит за пределы области видимости, занимаемая им память освобождается. В системе существуют стандартные механизмы функционирования в каждой из упомянутых ситуаций: для выполнения необходимых функций в каждом классе имеются используемые по умолчанию конструктор копирования, операция присваивания и деструктор.  [38]

Конструктор копирования класса имеет единственный параметр, представляющий собой ссылку на существующий объект того же класса. Если конструктор копирования не определен, компилятор сгенерирует его автоматически. Если такой механизм работы не подходит для вашего класса, определите собственный конструктор копирования.  [39]



Страницы:      1    2    3