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


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

А операция назначения и вызывающие объекты должны быть скопированы операции инициализации.

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

    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);.

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

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

Участник-велемудрое назначение предусматривано более подробно в Назначение и инициализация Memberwise.

Конструктор копий принимает аргумент типа имя класса**&**, где имя класса имя класса, для которого определяют конструктор.Например:

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

int main()
{
}
ПримечаниеПримечание

Сделайте тип аргумента имя класса const& конструктора копии, если возможно.Это предотвращает конструктор копии от случайного изменения объекта, от которого он копирует.Она также включает копирование из объектов const.

См. также

Ссылки

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