Практическое занятие № 15

Тема: перегрузка операций в классах

Цель: получить практические навыки по перегрузке операций для работы с классами в программах на С++

 

Ход работы

 

Пусть имеется некоторый объект "груз", описываемый свойствами: длина, ширина и высота. Опишите класс для работы с данным объектом.

Класс должен иметь конструктор с параметрами по умолчанию, конструктор  входными параметрами, а также методы ввода параметров класса, вывода параметров класса и нахождения объема груза.

Выполните перегрузку нескольких операций для класса:

- операция ">" для сравнения объемов двух грузов между собой;

- операция "+" для сложения объемов двух грузо;

- операция "++" для увеличения всех сторон груза на 1;

- операция "*" для умножения всех сторон груза на заданное целое число.

 

В главной программе опишите два экземпляра грузов: один со значениями по умолчанию, второй - с помощью параметров.

Выведите размеры грузов на экран. Определите, какой из них имеет больший объем.

 

Увеличьте параметры первого груза в 5 раз. Выведите новые размеры грузов на экран и еще раз определите какой из грузов имеет больший объем.

 

Введите с клавиатуры новые размеры второго груза. Примените к нему дважды операцию инкремента и выведите его новый размер на экран.

 

Определите объемы каждого груза, а также их. суммарный объем. При нахождении суммарного объема используйте два способа:

- суммируя объемы каждого груза;

- используя перегруженную операцию "+".

 

Указания:

 

#include <iostream.h>

#include <string.h>

 

//описываем класс "груз"

class gruz

{

    public:

    //поля класса: длина, ширина и высота

    float dlina, shirina, vysota;

 

    //конструктор со значениями по умолчанию

    gruz() {dlina=1; shirina=1; vysota=1;}

 

    //конструктор с входными параметрами

    gruz(float d, float s, float v)

    {

        dlina=d;

        shirina=s;

        vysota=v;

    }

 

    //метод ввода параметров класса

    void set()

    {

        cout<<"- длина: "; cin>>dlina;

        cout<<"- ширина: "; cin>>shirina;

        cout<<"- высота: "; cin>>vysota;

    }

 

    //метод вывода параметров класса

    void show()

    {

        cout<<"Размер: "<<dlina<<"x"<<shirina<<"x"<<vysota<<"\n";

    }

 

    //метод расчета объема

    float volume()

    {

        return dlina*shirina*vysota;

    }

 

    //переопределяем оператор "больше"

    int operator> (gruz g) const

    {

        //если объем первого груза больше или равен объему второго

        if (volume()>=g.volume())

                //метод возвращает 1 (true)

                return 1;

        /противном случае

        else

                //метод возвращает 0 (false)

                return 0;

    }

 

    //перегружаем операцию сложения,

    //которая суммирует объемы грузов

    float operator+ (gruz g) const

    {

        return volume()+g.volume();

    }

 

    //перегружаем операцию инкремента,

    //которая увеличивает на 1 все стороны груза

    gruz operator++ ()

    {

        dlina++;

        shirina++;

        vysota++;

    }

 

    //перегружаем операцию умножения,

    //которая увеличивает все стороны груза в заданное количество раз

    gruz operator* (int a)

    {

        //описываем переменные

        float d,v,s;

        //в каждую переменную записываем увеличенное значение стороны

        d=dlina*a;

        s=shirina*a;

        v=vysota*a;

        //возвращаем контсруктор, в который в качестве параметров

        //передаются найденные значения сторон

        return gruz(d,s,v);

    }

}; //конец описания класса

 

 

//главная программа

int main()

{

    system("chcp 1251>nul");

   //переменная для груза с параметрами по умолчанию

    gruz gr1;

    //переменная для груза с заданными параметрами

    gruz gr2(5,4,6);

 

    system("cls");

 

    //выводим параметры обоих грузов

    cout<<"Исходные данные:\n";

    cout<<"- первый груз: "; gr1.show();

    cout<<"- второй груз: "; gr2.show();

 

    //выводим номер груза с наибольшим объемом

    if (gr1>gr2)

            cout<<"Наибольший объем у первого груза\n";

    else

            cout<<"Наибольший объем у второго груза\n";

 

    cout<<"==========================================\n";

 

    //увеличим параметры первого груза в 5 раз

    gr1=gr1*5;

 

    //выводим новые параметры обоих грузов

    cout<<"После увеличения первого груза в 5 раз:\n";

    cout<<"- первый груз: "; gr1.show();

    cout<<"- второй груз: "; gr2.show();

 

    //выводим номер груза с наибольшим объемом

    if (gr1>gr2)

            cout<<"Наибольший объем у первого груза\n";

    else

            cout<<"Наибольший объем у второго груза\n";

 

    cout<<"==========================================\n";

 

    //вводим новые параметры второго груза

    cout<<"Введите новые данные о втором грузе:\n";

    gr2.set();

 

    //выполним для второго груза дважды операцию инкремента

    gr2++;

    gr2++;

 

    //выведем параметры второго груза на экран

    cout<<"После двух инкрементов груз имеет размеры: ";

    gr2.show();

 

    cout<<"==========================================\n";

 

    //найдем общий объем двух грузов

    cout<<"Объем первого груза="<<gr1.volume()<<"\n";

    cout<<"Объем второго груза="<<gr2.volume()<<"\n";

    cout<<"Общий объем грузов(первый способ)="<<gr1.volume()+gr2.volume()<<"\n";

    cout<<"Общий объем грузов(второй, более естественный способ)="<<gr1+gr2<<"\n";

 

   system("pause");

}