Конструктор копирования - 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;
}-
Копирование - это процесс дублирования данных из одной области памяти в другую. Поверхностное копирование создает новый объект и вставляет в него ссылки на оригинальные объекты, тогда как глубокое копирование создает новый объект и рекурсивно копирует все объекты, находящиеся в оригинале.
-
В примерах на C++ показаны реализации поверхностного и глубокого копирования для класса Person, который содержит информацию о человеке и указатель на структуру Number, представляющую телефонный номер. В поверхностном копировании при создании нового объекта Person копируются ссылки на существующие данные, что может привести к проблемам при удалении оригинального объекта, так как новый объект будет ссылаться на уже освобожденную память. В глубоком копировании создается новая структура Number, что позволяет избежать проблем с памятью, так как каждый объект имеет свои собственные данные.