Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
01.11.2025
Размер:
2.66 Кб
Скачать
#include <iostream>
#include <windows.h>
using namespace std;

// Пример класса, где копирование недопустимо
class NonCopyable {
private:
    int* data;
    
    // Запрещаем копирование
    NonCopyable(const NonCopyable&);
    NonCopyable& operator=(const NonCopyable&);
    
public:
    NonCopyable(int value) {
        data = new int(value);
        cout << "Создан NonCopyable объект со значением: " << value << endl;
    }
    
    ~NonCopyable() {
        delete data;
        cout << "NonCopyable объект удален" << endl;
    }
    
    int getValue() { return *data; }
};

// Пример класса с обычным копированием
class Copyable {
private:
    int value;
    
public:
    Copyable(int v = 0) : value(v) {
        cout << "Создан Copyable объект со значением: " << value << endl;
    }
    
    // Конструктор копирования
    Copyable(const Copyable& other) : value(other.value) {
        cout << "Вызван конструктор копирования Copyable" << endl;
    }
    
    int getValue() { return value; }
};

// Ситуации вызова конструктора копирования:
void func1(Copyable c) { // 1. Передача по значению
    cout << "В func1: значение = " << c.getValue() << endl;
}

Copyable func2() { // 2. Возврат по значению
    Copyable c(20);
    return c;
}

int main() {
    SetConsoleOutputCP(65001);
    
    cout << "=== Задание 2.16 - Конструктор копирования ===" << endl;
    
    Copyable c1(10);
    
    cout << "\nСитуации вызова конструктора копирования:" << endl;
    
    cout << "1. Инициализация:" << endl;
    Copyable c2 = c1;
    
    cout << "2. Прямой вызов:" << endl;
    Copyable c3(c1);
    
    cout << "3. Передача в функцию по значению:" << endl;
    func1(c1);
    
    cout << "4. Возврат из функции по значению:" << endl;
    Copyable c4 = func2();
    
    cout << "\nПример класса, где копирование недопустимо:" << endl;
    NonCopyable nc1(5);
    // NonCopyable nc2 = nc1; // Ошибка - копирование запрещено
    cout << "Попытка копирования объекта NonCopyable приведет к ошибке компиляции" << endl;
    
    return 0;
}
Соседние файлы в папке Лаба2