Кратко

  • При поверхностном копировании создаётся новый объект, который копирует значения всех членов данных (полей) из исходного объекта. Если член данных является указателем, копируется только значение указателя, а не данные, на которые он указывает.
  • При глубоком копировании создаётся новый объект, который получает копии всех динамически выделенных данных и других ресурсов из исходного объекта. Это означает, что объект создаёт собственные копии данных, на которые указывают указатели, а не просто копирует сами указатели.
#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;
}