- •Задание к программе 1.1
- •Задание к программе 1.2
- •*Задание к программе 1.3
- •*Задание к программе 1.4
- •2. Контрольные вопросы к лабораторной работе №1
- •Объектно-ориентированное программирование Лабораторная работа №2 Дружественные функции, перегрузка операций
- •1. Задание к лабораторной работе
- •Задание к программе 2.2
- •Задание к программе 2.3
- •*Задание к программе 2.4
- •2. Контрольные вопросы к лабораторной работе №2
- •Объектно-ориентированное программирование Лабораторная работа №3 Наследование
- •1. Задание к лабораторной работе
- •Задание к программе 3.1
- •2. Контрольные вопросы к лабораторной работе №3
Задание к программе 2.2
Упражнения:
Закомментируйте первую строку программы (class PRE_AMP;), запустите компилятор и объясните сообщения об ошибках.
Создайте динамический массив из n предусилителей, пользуясь операторами new и delete.
Задание (общее)
Создайте функцию-член класса OUT_AMP, которая является дружественной для класса PRE_AMP и вычисляет общий коэффициент усиления (произведение всех коэффициентов усиления) устройства.
Создайте дружественную функцию для классов OUT_AMP и PRE_AMP, которая не является членом этих классов и вычисляет общее число транзисторов усилительного устройства. Параметр "число транзисторов" ввести в классы.
Программа 2.3. Программа, в которой реализован простейший пример перегрузки операции суммирования.
#include <iostream.h>
#include <stdlib.h>
class Matrix{
int m[2][2];
public:
Matrix(int=0); //Конструктор с умалчиваемым значением параметра
void display();
Matrix operator+(Matrix); //Прототип функции-оператора
};
void Matrix::display()
{
cout<<m[0][0]<<' '<<m[0][1]<<endl;
cout<<m[1][0]<<' '<<m[1][1]<<endl;
}
Matrix::Matrix(int C)
{
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
m[i][j]=random(C);
}
Matrix Matrix::operator+(Matrix ob)
{
Matrix tmp(2);
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
tmp.m[i][j]=m[i][j]+ob.m[i][j];
return tmp;
}
int main()
{
randomize();
Matrix a(50),b(30),c;
c=a+b;
a.display();
b.display();
c.display();
return 0;
}
Задание к программе 2.3
Первый вариант: Создать перегруженные операции: сложения элементов матрицы с целым числом (использовать знак операции "+") и вычисления определителя матрицы (обозначить значком "!").
Второй вариант: Создать перегруженные операции: умножения элементов матрицы на целое число и умножения матриц (использовать знак операции "*").
*Программа 2.4. Программа демонстрирует некоторые особенности создания перегруженных операций при использовании динамической памяти (см. комментарии после текста программы), необходимость применения ссылок и конструктора копирования.
#include <iostream.h>
#include <stdlib.h>
class Array{
int n;
int *p;
static int count;
public:
void show();
Array operator+(Array &);
void ERRMEM();
Array(const Array &); //Конструктор копии
Array(int=0); //Конструктор с умалчиваемым значением
~Array();
};
int Array::count=0; //Инициализация статического члена
Array::Array(int i) //Определение конструктора
{ //с умалчиваемым значением
++count;
n=i;
if(n!=0)
{
p=new int[n];
if(!p) ERRMEM();
cout<<"Введите элементы массива "<<count<<endl;
for(int i=0;i<n;i++)
cin>>p[i];
}
}
Array::Array(const Array &ob) //Определение конструктора
{ //копирования
++count;
n=ob.n;
p=new int [n];
if(!p) ERRMEM();
for(int i=0;i<ob.n;i++)
p[i]=ob.p[i];
}
void Array::ERRMEM()
{
cout<<"Ошибка выделения памяти"<<endl;
exit(1);
}
Array::~Array()
{
delete [] p;
}
void Array::show()
{
for(int i=0;i<n;i++)
cout<<p[i]<<' ';
cout<<endl;
}
Array Array::operator+(Array &ob)
{
if(n!=ob.n)
{
cout<<"Ошибка: Размеры массивов не совпадают"<<endl;
exit(2);
}
Array tmp=ob; //Сработает конструктор копирования
for(int i=0;i<n;i++)
tmp.p[i]+=p[i];
return tmp;
}
int main()
{
Array a(3),b(3),c;
cout<<"a: ";
a.show();
cout<<"b: ";
b.show();
c=a+b;
cout<<"c: ";
c.show();
return 0;
}
Комментарии к программе 2.4.
1. Если в теле перегруженной операции создать временный объект (Array tmp;), то создастся объект с нулевым количеством элементов. Поэтому сумму подсчитать будет невозможно.
2. Если в теле перегруженной операции создать временный объект (Array tmp(n);) с числом элементов n, то для него из-за содержания конструктора необходимо будет вводить элементы с клавиатуры, а это нецелесообразно и неудобно.
3. Если записать так:
Array tmp;
tmp=ob;
то после операции присвоения указатели у обоих объектов будут равны и после срабатывания деструктора для tmp разрушится указатель на область динамической памяти и для объекта tmp и для объекта ob.
4. По причине выше изложенного, разработан специальный конструктор копирования, который срабатывает только при инициализации. В перегруженной функции-операторе создается объект tmp и инициализируется (Array tmp=ob;). При этом, благодаря конструктору копирования, для объекта tmp создается собственная область динамической памяти, в которую заносятся данные из динамической области копируемого объекта (инициализатора), в данном случае объекта ob. При возвращении из функции-оператора срабатывает деструктор объекта tmp, который освобождает его динамическую память.
5. Поскольку объект ob передается в функцию-оператор по ссылке, его копия не создается и деструктор этого объекта не срабатывает.