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

Задание к программе 2.2

Упражнения:

  1. Закомментируйте первую строку программы (class PRE_AMP;), запустите компилятор и объясните сообщения об ошибках.

  2. Создайте динамический массив из n предусилителей, пользуясь операторами new и delete.

Задание (общее)

  1. Создайте функцию-член класса OUT_AMP, которая является дружественной для класса PRE_AMP и вычисляет общий коэффициент усиления (произведение всех коэффициентов усиления) устройства.

  2. Создайте дружественную функцию для классов 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 передается в функцию-оператор по ссылке, его копия не создается и деструктор этого объекта не срабатывает.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]