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

class Journal {
    int pages;
    char* editor;
    int number;
public:
    Journal(int p, char* ed, int num) : pages(p), number(num) {
        editor = new char[strlen(ed) + 1];
        strcpy(editor, ed);
        cout << "Создан журнал: " << editor << ", страниц: " << pages << endl;
    }
    ~Journal() { 
        delete[] editor; 
        cout << "Журнал удален" << endl;
    }
};

class Book {
    int pages;
    char* name;
    int year;
public:
    // Конструктор с параметром по умолчанию
    Book(int p = 10) { 
        pages = p; 
        name = new char[1]; 
        *name = '\0'; 
        year = 2007;
        cout << "Создана книга: страниц = " << pages << ", год = " << year << endl;
    }
    ~Book() { 
        delete[] name; 
        cout << "Книга удалена" << endl;
    }
};

class Page {
    int num;
    int format;
public:
    // Конструктор по умолчанию (неявно создается компилятором)
    Page() {
        cout << "Создана страница с конструктором по умолчанию" << endl;
    }
};

// Выносим enum за пределы класса, чтобы сделать его публичным
enum Size {A0, A1, A2, A3, A4, A5};

class CopyBook {
    int pages;
    Size sz;  // используем публичный enum
    char name[20];
public:
    // Только конструктор копирования, нет конструктора по умолчанию
    CopyBook(const CopyBook& c) {
        sz = c.sz;
        strcpy(name, c.name);
        pages = c.pages;
        cout << "Создана копия тетради: " << name << ", размер: A" << sz << endl;
    }
    
    // Добавляем конструктор с параметрами для демонстрации
    CopyBook(int p, Size s, const char* n) : pages(p), sz(s) {
        strcpy(name, n);
        cout << "Создана тетрадь: " << name << ", страниц: " << pages << ", размер: A" << s << endl;
    }
};

int main() {
    SetConsoleOutputCP(65001);
    
    cout << "=== Задание 2.12 ===" << endl;
    cout << "Демонстрация конструкторов по умолчанию" << endl;
    
    cout << "\n1. Book можно создавать без параметров:" << endl;
    Book b;  // Работает - есть конструктор с параметром по умолчанию
    
    cout << "\n2. Page можно создавать без параметров:" << endl;
    Page p;  // Работает - компилятор создает конструктор по умолчанию
    
    cout << "\n3. Journal НЕЛЬЗЯ создавать без параметров:" << endl;
    // Journal j; // Ошибка компиляции - нет конструктора по умолчанию
    cout << "   (закомментировано, чтобы программа компилировалась)" << endl;
    
    cout << "\n4. CopyBook НЕЛЬЗЯ создавать без параметров:" << endl;
    // CopyBook cb; // Ошибка компиляции - нет конструктора по умолчанию
    cout << "   (закомментировано, чтобы программа компилировалась)" << endl;
    
    cout << "\nНо CopyBook можно создавать через конструктор с параметрами:" << endl;
    CopyBook original(100, A4, "Математика");  // Используем публичный enum
    
    cout << "\nИ через конструктор копирования:" << endl;
    CopyBook copy(original);  // Работает - есть конструктор копирования
    
    cout << "\n=== ИТОГ ===" << endl;
    cout << "Классы, которые можно создавать без параметров:" << endl;
    cout << "- Book (есть конструктор с параметром по умолчанию)" << endl;
    cout << "- Page (компилятор создает конструктор по умолчанию)" << endl;
    
    cout << "\nКлассы, которые НЕЛЬЗЯ создавать без параметров:" << endl;
    cout << "- Journal (нет конструктора по умолчанию)" << endl;
    cout << "- CopyBook (нет конструктора по умолчанию)" << endl;
    
    cout << "\nУсловия, при которых конструктор по умолчанию не создается:" << endl;
    cout << "1. Если определен любой другой конструктор" << endl;
    cout << "2. Если класс содержит ссылки или константные поля" << endl;
    cout << "3. Если базовый класс не имеет конструктора по умолчанию" << endl;
    
    return 0;
}
Соседние файлы в папке Лаба2