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

Объектно-ориентированное программирование Лабораторная работа №2 Дружественные функции, перегрузка операций

Цель работы – изучить дружественные функции, не являющиеся членами класса, и дружественные функции – члены класса. Изучить функции-операторы, с помощью которых реализуется перегрузка операций.

1. Задание к лабораторной работе

Программа 2.1. Программа демонстрирует использование дружественной функции, которая не является членом-функцией классов, но имеет доступ к членам классов, для которых она объявлена дружественной. Для доступа к членам класса в дружественную функцию передаются объекты классов (в данном примере по значению).

#include <iostream.h>

#define pi 3.14159

class Rectangle; //Предварительное объявление класса

class Circle{

float S;

float R;

void area() {S=pi*R*R;}

friend float sumS(Rectangle,Circle);//Объявление "дружественности"

public:

Circle(float r) {R=r;}

};

class Rectangle{

float a,b;

float S;

void area() {S=a*b;}

friend float sumS(Rectangle,Circle); //Объявление "дружественности"

public:

Rectangle(float length,float width) {a=length;b=width;}

};

float sumS(Rectangle ro, Circle co) //Определение дружественной

{ //функции

ro.area();

co.area();

return ro.S+co.S;

}

int main()

{

Circle c(1.0);

Rectangle r(2.0,3.0);

cout<<"Суммарная площадь фигур: "<<sumS(r,c)<<endl;

return 0;

}

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

Упражнения:

  1. Попробуйте разработать аналогичную дружественную функцию, в которую не передаются в качестве аргументов объекты классов. Объясните суть возникающей при этом ошибки;

  2. *Разработайте перегруженную дружественную функцию, в которую передаются указатели на объекты класса.

Задания:

Первый вариант: Добавить в программу класс Triangle (Треугольник) и разработать дружественную функцию, которая выводит на печать наименование фигуры (Rectangle, Circle или Triangle), площадь которой больше.

Второй вариант: Добавить в программу класс Triangle (Треугольник) и разработать дружественную функцию, которая выводит на печать наименование фигуры (Rectangle, Circle или Triangle), периметр (длина окружности) которой больше.

Программа 2.2. Программа, в которой созданы два класса OUT_AMP (Выходной усилитель) и PRE_AMP (Предварительный усилитель). Усилители имеют параметры: I – ток потребления и K ‑ коэффициент усиления. Функция float isum(PRE_AMP *) const является членом класса OUT_AMP и одновременно объявлена дружественной для класса PRE_AMP. Модификатор const указывает, что эта функция не может менять значения членов класса. Функция вычисляет суммарный ток потребления усилительного устройства, состоящего из нескольких предварительных усилителей и одного выходного усилителя.

#include <iostream.h>

#define n 3

class PRE_AMP;

class OUT_AMP{

float K;

float I;

public:

float isum(PRE_AMP *) const;

OUT_AMP(float a,float b)

{K=a; I=b;}

};

class PRE_AMP{

float K;

float I;

static int count;

friend float OUT_AMP::isum(PRE_AMP *) const;

public:

void setKI(float,float);

PRE_AMP();

};

int PRE_AMP::count=0;

PRE_AMP::PRE_AMP()

{++count;}

void PRE_AMP::setKI(float a,float b)

{K=a; I=b;}

float OUT_AMP::isum(PRE_AMP *obj) const

{

float sum=0.0;

for(int i=0;i<PRE_AMP::count;i++)

sum+=obj[i].I;

return sum+I;

}

int main()

{

OUT_AMP oa(3,10);

PRE_AMP pa[n];

float a,b;

for(int i=0;i<n;i++)

{

cout<<"Введите Ку и Iп "<<i+1<<"-го предусилителя"<<endl;

cin>>a>>b;

pa[i].setKI(a,b);

}

cout<<"Суммарный ток потребления: "<<oa.isum(pa)<<endl;

return 0;

}

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