Конструктор копирования - IsuiGit/borodaedu GitHub Wiki

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

Копирование как концепция

Копирование - процесс дублирования данных из ячеек памяти одной области (адреса) в другую. Называется зачастую либо дублированием, либо простым копированием.

  • Поверхностная копия создает новый составной объект, и затем (по мере возможности) вставляет в него ссылки на объекты, находящиеся в оригинале.

Глубокое копирование - процесс переноса ячеек памяти и данных из области в другую, с последующим "затиранием" прошлой области.

  • Глубокая копия создает новый составной объект, и затем рекурсивно вставляет в него копии объектов, находящихся в оригинале.

Пример поверхностного копирования поля со структурой

#include <iostream>

typedef struct Number {
    int code;
    int number;
} Number;

class Person {
public:
    Person(const Person &p) { // <- конструктор копирования. В качестве аргумента принимает ссылку на другой объект того же класса что и создаваемый экземпляр
        this->name = p.name;
        this->age = p.age;
        this->email = p.email;
        this->password = p.password;
        this->phone = p.phone; // <- создаем поверхностную копию структуры Number, присваивая старый адрес в новую структуры
    }

    Person(std::string name, int age, std::string emal, std::string password, Number* n):
    name(name), age(age), email(email), password(password), phone(n){}

    Person() { name = ""; age = 0; email = ""; password = ""; phone = new Number(); }
    
    void print() {
        std::cout << "#   class Person info\n";
        std::cout << "#   name: " << name << "\n";
        std::cout << "#   age: " << age<< "\n";
        std::cout << "#   email: " << email << "\n";
        std::cout << "#   password: " << password << "\n";
        std::cout << "#   phone code: " << phone->code << "\n";
        std::cout << "#   phone number: " << phone->number << "\n";
    }

    std::string name;
    int age;
    std::string email;
    std::string password;
    Number* phone;
};

int main()
{
    Person* p1 = new Person("Vasya", 25, "[email protected]", "password", new Number());
    Number n;
    n.code = 7;
    n.number = 9999999999;
    p1->phone = &n;
    Person p2(*p1); // <- Создаем на основе p1 новый экземпляр класса Person p2;
    p2.print();
    getchar();
    delete p1; // <- Удаляем экземпляр с которого была взята копия
    p2.print(); // <- При выводе информации мы увидим, что экземпляр структуры Number сохранился в памяти нового объекта при удалении старого
    std::cout << "Press any key to continue\n";
    getchar();
    return 0;
}

Пример глубокого копирования поля со структурой

typedef struct Number {
    Number() { code = 0; number = 0; }
    Number(const Number& n) { code = n.code; number = n.number; }
    int code;
    int number;
} Number;

class Person {
public:
    Person(const Person &p) {
        this->name = p.name;
        this->age = p.age;
        this->email = p.email;
        this->password = p.password;
        this->phone = new Number(*p.phone); // <- Создаем новую (глубокую) копию объекта, создавая новую структуру с ссылками на значения
    }

    Person(std::string name, int age, std::string emal, std::string password, Number* n):
    name(name), age(age), email(email), password(password), phone(n){}

    Person() { name = ""; age = 0; email = ""; password = ""; phone = new Number(); }
    
    void print() {
        std::cout << "#   class Person info\n";
        std::cout << "#   name: " << name << "\n";
        std::cout << "#   age: " << age<< "\n";
        std::cout << "#   email: " << email << "\n";
        std::cout << "#   password: " << password << "\n";
        std::cout << "#   phone: " << phone << "\n";
        std::cout << "#   phone code: " << phone->code << "\n";
        std::cout << "#   phone number: " << phone->number << "\n";
    }

    std::string name;
    int age;
    std::string email;
    std::string password;
    Number* phone;
};

int main()
{
    Person* p1 = new Person("Vasya", 25, "[email protected]", "password", new Number());
    Person* p2 = new Person(*p1);
    p2->print();
    getchar();
    delete p1;
    p2->print();
    delete p2;
    std::cout << "Press any key to continue\n";
    getchar();
    return 0;
}

Summary

  1. Копирование - это процесс дублирования данных из одной области памяти в другую. Поверхностное копирование создает новый объект и вставляет в него ссылки на оригинальные объекты, тогда как глубокое копирование создает новый объект и рекурсивно копирует все объекты, находящиеся в оригинале.

  2. В примерах на C++ показаны реализации поверхностного и глубокого копирования для класса Person, который содержит информацию о человеке и указатель на структуру Number, представляющую телефонный номер. В поверхностном копировании при создании нового объекта Person копируются ссылки на существующие данные, что может привести к проблемам при удалении оригинального объекта, так как новый объект будет ссылаться на уже освобожденную память. В глубоком копировании создается новая структура Number, что позволяет избежать проблем с памятью, так как каждый объект имеет свои собственные данные.

sitemap | C++ | ООП

⚠️ **GitHub.com Fallback** ⚠️