Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практичні і лабораторні заняття.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
382.98 Кб
Скачать

Int main()

{clrscr();

String s3=”Будь-яка пробна фраза”;

cout<<”\ns3=”;s3.display();

String s1,s2;

s1=s2=s3;

cout<<”\ns1=”;s1.display();

cout<<”\ns2=”;s2.display();

cout<<endl;

bioskey(0);

return 0;

}

Програма 22.21

Лабораторне заняття 11-12 Теоретична частина

Базується на матеріалі лекцій 22-25. Віртуалізація функцій, дружні функції. Перевизначення конструктора копіювання та оператора присвоювання.

Завдання 1

Створити клас publication (відповідає видавничій компанії, що випускає книги та аудіодиски), який містив би поля: title (заголовок) рядкового типу і price (ціна) типу float та методи getdata() і putdata() для вводу і виводу даних відповідно. Методи оголосити віртуальними.

Використовуючи цей метод як базовий, створити два похідні класи: book (книги) та tape (аудіодиски). Клас book порівняно з базовим містить додаткове поле даних pages (кількість сторінок) типу int. Клас tape порівняно з базовим містить додаткове поле time (час тривання) типу float. Для обох похідних класів перевизначити обидва методи базового класу.

В головній функції створити масив вказівників на клас publication. Для введення даних організуйте цикл, в якому спершу користувач вибирав би, чи наступний введений об’єкт має бути книгою чи аудіодиском, потім виконувався б new для створення відповідного об’єкту, викликався метод введення і видавався запит про продовження вводу. Після завершення виводу вивести результат для всіх введених кних та аудіодисків, використовуючи цикл for та єдиний вираз типу pubarr[j]->putdata(). За зразок можна взяти програму 22.4.

Завдання 2

В класі Distance створити перезавантажувану операцію множення, яка давала б змогу множити дві відстані. Зробити цю функцію дружньою,, щоб можна було використовувати вираз типу dist2=2.5*dist1. Нам знадобиться конструктор з одним аргументом для переведення величин типу float у Distance. Написати головну функцію, яка б кількома способами перевіряла роботу перезавантаженого оператора. Використовувати як зразок програму 22.10

Завдання 3

Класи можуть поводитися як масиви. Далі приведено приклад програми, яка це здійснює:

#include<iostream.h>

#include<conio.h>

#include<stdio.h>

#include<bios.h>

////////////////

class Array

{private:

int* ptr;

int size;

public:

Array():ptr(0),size(0)

{ }

Array(int s):size(s)

{ptr=new int[s];}

~Array()

{delete[] ptr;}

int& operator[](int j)

{return *(ptr+j);}

};

///////////////

Int main()

{clrscr();

const int ASIZE=10;

Array arr1(ASIZE);

for(int j=0;j<ASIZE;j++)

arr1[j]=j*j;

cout<<arr1[j]<<" ";

cout<<endl;

bioskey(0);

return 0;

}

Взявши цю програму за основу, додати перезавантажуване присвоювання і перезавантажуваний оператор копіювання до класу Array. Потім додати до головної функції вирази Array arr2(arr1); і arr3=arr1 для перевірки того, що перезавантажені оператори працюють. Конструктор копіювання повинен створювати новий об’єкт зі своїм власним місцем у пам’яті, виділеним для збереження елементів масиву. І конструктор копіювання і оператор присвоювання повинні копіювати вміст старого об’єкту класу Array в новий.

Рекомендовані описувачі для конструктора копіювання та оператора присвоювання

Array(Array&);

Array& operator=(Array&);

В тілі перезавантаженого оператора присвоювання попередньо видалити попередній вміст масиву за допомогою функції delete

delete[] ptr;

Нове місце в пам’яті можна виділяти за допомогою операції

ptr=new int[a.size];

Присвоєння елементів одного масиву-об’єкту іншому можна здійснювати за допомогою виразу

*(ptr+j)=*(a.ptr+j);