Все выпуски  

Профессиональное программирование


Информационный Канал Subscribe.Ru

В начало Клуб программистов Весельчак У Связаться со мной
a

Здравствуйте.

Несколько загружен, поэтому коротко:

Прекрасно функционирует лента блога. Новости обновляются ежедневно даже по нескольку раз, а экспорт позволяет за ними следить.

Это я к тому, что здесь: http://club.shelek.com/exp.php можно легко увидеть все инструкции по RSS экспорту наших новостей. Имеется 4 канала - блог, статьи, файлы и ссылки.

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

 

А сегодня вышел новый выпуск статьи:

Копирование и присваивание

Автор: Михалыч

Классы: копирование и присваивание

Часть 1

В этой части мы продолжим начатое в статье «Элементы класса, о которых всегда необходимо помнить» обсуждение конструктора копий (copy constructor) и операции присваивания (assignment operator). Или, вернее, начнем подробное рассмотрение весьма нетривиальной проблемы, каковой на самом деле является копирование и присваивание в классах.
Эти два элемента вполне заслужили отдельного рассмотрения. Создание программ на C++ без понимания внутренней сущности этих функций-членов сродни бегу на марафонскую дистанцию без тренировки (возможно, это не самое удачное сравнение, проще говоря, эти функции очень важны).
Конструктор копий служит для создания новых объектов из существующих. Операция присваивания нужна для того, чтобы сделать один существующий объект эквивалентным другому существующему.
Что означает «создать копию»? Как один из вариантов, это означает присваивание значений элементов одного объекта элементам другого. Этот ответ, однако, далеко не полон. C++ - это язык, который практически не ограничивает выбор пути реализации программы. И способ создания копий объектов - не исключение из этого правила.
Иногда для копирования классов достаточно просто привести один объект в то же состояние, что и другой. Это весьма просто, и мы увидим, как это делается. Однако если вашему приложению требуются другие методы копирования, C++ не станет создавать их за вас, хотя, если вы не напишете эти функции, компилятор сделает это сам. Правда, результат при этом может существенно отличаться от того, что вам бы хотелось.
В серии этих статей мы рассмотрим все аспекты этого вопроса, по разделам:

  • Понятие копирования
  • Копирование буквальное и развернутое
  • Когда выполняется копирование
  • Разница между копированием и присваиванием
  • Положение в классах
  • Блокирование копирования и присваивания
  • Реализация копирования через присваивание
  • Копирование и присваивание в производных классах

    Понятие копирования

    Здесь мы поговорим об одном из аспектов внутреннего функционирования программ, написанных на C++ - о копировании. Копирование в программах на C++ происходит, прямо или косвенно, буквально на каждом шагу. Причем, не всегда с первого взгляда очевидно, где происходит копирование, а где – нет.
    Мы начнем с рассмотрения синтаксиса интересующего нас предмета, а затем попробуем углубиться в его осмысление.

    Определение конструктора копий

    Конструктор копий используется для создания новых объектов из уже существующих. Это означает, что, так же как для других конструкторов, новый объект еще не существует к моменту его вызова. Однако только конструктору копий объект передается как аргумент по ссылке. Итак, синтаксис конструктора копий прост. Конструктор копий произвольного класса X выглядит так:
    Х(const X&) ; // конструктор копий класса Х
    Так как конструктор копий - это все таки конструктор, то он должен иметь имя, совпадающее с именем класса (не забывайте – с учетом регистра символов). Назначение конструктора копий - дублирование объекта-аргумента для построения нового объекта. Одно из основных правил: если аргумент не должен изменяться, то его следует передавать как константу. В то же время, если аргумент не описан как константа, то нельзя копировать объекты-константы. Переменный объект всегда можно передать как постоянный аргумент, но не наоборот.
    Вторая часть объявления аргумента, X, проста: копируется объект того же самого типа. Аргумент в целом читается как "постоянная ссылка на X". Ссылка существенна по нескольким соображениям. В первую очередь потому, что при передаче адреса объекта не создается копия вызывающего объекта (в отличие от передачи аргумента по значению). Если вам чудится здесь какой-то подвох, то будьте внимательны.
    Работа конструктора копий - создание ранее не существовавшего объекта из уже существующего, а передача по значению (без использования операции получения адреса) требует создания копии аргумента, значит мы получаем бесконечную рекурсию. Точнее: при передаче объекта по значению создается его копия, если это произойдет в конструкторе копий, то он будет вызывать сам себя, пока не исчерпает все ресурсы системы.
    Вот несколько правил, которым надо следовать при объявлениях конструктора копий:

  • Имя функции точно совпадает с именем класса.
  • Аргумент объявляется постоянным, что позволяет принимать как постоянные, так и переменные аргументы.
  • Тип аргумента является типом класса.
  • Аргумент передается по ссылке, т. е. с помощью операции получения адреса.
  • Вся статья: http://club.shelek.com/viewart.php?id=244

    И на сегодня это все.

    С уважением и добрыми пожеланиями всем, Громозека.

     


    http://subscribe.ru/
    http://subscribe.ru/feedback/
    Подписан адрес:
    Код этой рассылки: comp.soft.prog.compu
    Отписаться

    В избранное