Поделиться через


Копирование объектов классов

Как при операции назначения, так и при операции инициализации выполняется копирование объектов.

  • Присваивание — если значение одного объекта присваивается другому объекту, первый объект копируется во второй объект. Поэтому

    Point a, b;
    ...
    a = b;
    

    приводит к тому, что значение b копируется в значение a.

  • Инициализация — инициализация выполняется в следующих случаях: объявляется новый объект, аргументы передаются в функции по значению или значения возвращаются из функций по значению.

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

TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;

Предыдущий код может означать "копировать содержимое FILE1.DAT в FILE2.DAT" или "игнорировать FILE2.DAT и сделать b вторым дескриптором FILE1.DAT". Необходимо вложить соответствующую семантику копирования в каждый класс следующим образом.

  • С помощью оператора присваивания operator= вместе со ссылкой на тип класса в качестве возвращаемого типа и параметра, передаваемого ссылкой const, например ClassName& operator=(const ClassName& x);.

  • С помощью конструктора копии. Дополнительные сведения о конструкторе копии см. в разделе Правила объявления конструкторов.

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

Дополнительные сведения о почленном присваивании см. в разделе Назначение и инициализация по членам.

Конструктор копии принимает аргумент типа class-name**&**, где class-name — это имя класса, для которого определен конструктор. Например:

// spec1_copying_class_objects.cpp
class Window
{
public:
    Window( const Window& ); // Declare copy constructor.
    // ...
};

int main()
{
}

Примечание

По возможности сделайте тип аргумента конструктора копии const class-name&.Это поможет избежать случайного изменения копируемого объекта конструктором копии.Это также позволит выполнять копирование из объектов const.

См. также

Ссылки

Специальные функции-члены (C++)