При поверхностном копировании создаётся новый объект, который копирует значения всех членов данных (полей) из исходного объекта. Если член данных является указателем, копируется только значение указателя, а не данные, на которые он указывает.
При глубоком копировании создаётся новый объект, который получает копии всех динамически выделенных данных и других ресурсов из исходного объекта. Это означает, что объект создаёт собственные копии данных, на которые указывают указатели, а не просто копирует сами указатели.
#include <iostream>class Data {private: int* data; // Указатель на данныеpublic: // Конструктор по умолчанию Data() : data(nullptr) {} // Конструктор с инициализацией Data(int value) : data(new int(value)) {} // Конструктор копирования (поверхностное копирование) Data(const Data& other) { data = other.data; // Поверхностное копирование указателя std::cout << "Shallow Copy Constructor" << std::endl; } // Конструктор копирования (глубокое копирование) Data(const Data& other, bool deepCopy) { if (deepCopy) { data = new int(*other.data); // Глубокое копирование данных std::cout << "Deep Copy Constructor" << std::endl; } else { data = other.data; // Поверхностное копирование указателя std::cout << "Shallow Copy Constructor" << std::endl; } } // Деструктор ~Data() { delete data; } // Метод для получения данных int getData() const { return data ? *data : 0; }};int main() { // Создание объекта с использованием поверхностного копирования Data obj1(10); Data copyObj1 = obj1; // Поверхностное копирование std::cout << "Data in copyObj1: " << copyObj1.getData() << std::endl; std::cout << std::endl; // Создание объекта с использованием глубокого копирования Data obj2(20); Data copyObj2(obj2, true); // Глубокое копирование std::cout << "Data in copyObj2: " << copyObj2.getData() << std::endl; return 0;}