Главная->Інформатика та програмування->Содержание->Операции арифметического присваивания

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 8) онлайн

Операции арифметического присваивания

Давайте закончим наше изучение перегрузки бинарных операций на примере арифметического присваивания: +=. Вспомним, что эта операция выполняет при- сваивание и сложение за один шаг. Мы будем использовать эту операцию для сложения интервалов, записывая результат в переменную, обозначающую пер- вый интервал. Это похоже на пример ENGLPLUS, представленный нами ранее, но здесь есть небольшое отличие. Приведем листинг программы ENGLPLEQ.

// engpleq.cpp // перегрузка операции += #include <iostream>

using namespace std;

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

class Distance          // класс английских мер длины

{

  private:

    int feet;

    float inches;

  public:

    // конструктор без параметров

    Distance ( ) : feet ( 0 ), inches ( 0.0 )

      { }

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

    Distance ( int ft, float in ) : feet ( ft ), inches ( in )

      { }

    // получение информации от пользователя

    void getdist ( )

      {

        cout << "\nВведите футы: "; cin >> feet;

        cout << "Введите дюймы: ";  cin >> inches;

      }

    // показ информации

    void showdist() const

      { cout << feet << "\'-" << inches << '\"'; }

    // сложение с присвоением

    void operator += ( Distance );

};

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

void Distance::operator+= ( Distance d2 )

{

  feet += d2.feet;      // складываем футы

  inches += d2.inches;  // складываем дюймы

  if ( inches >= 12.0 ) // если дюймов больше 12

  {

    inches -= 12.0;     // то уменьшаем дюймы на 12

    feet++;             // увеличиваем футы на 1

  }

}

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

int main ( )

{

  Distance dist1;              // определяем переменную

  dist1.getdist ( );           // и вводим информацию

  cout << "\ndist1 = "; dist1.showdist ( );

 

  Distance dist2 ( 11, 6.25 ); // описываем и инициализируем другую переменную

  cout << "\ndist2 = "; dist2.showdist ( );

 

  dist1 += dist2;              // dist1 = dist1 + dist2

  cout << "\nПосле добавления:";

 

  cout << "\ndist1 = "; dist1.showdist ( );

  cout << endl;

 

  return 0;

}

 

В этой программе мы получаем интервал от пользователя и складываем его со вторым интервалом, инициализированным в программе как 11'-6.25". Пример простого взаимодействия с программой:

Введите футы: 3 Введите дюймы: 5.75 dist1 = 3'-5.75" dist2 = 11'-6.25" После добавления: dist1 = 15'-О"

В этой программе сложение выполняется в функции main() в строке

dist1 += dist2;

Это означает, что сумма интервалов dist1 и dist2 будет записана в перемен- ную dist1.

Заметим, что существует различие между функцией operator+=(), использу- емой здесь, и функцией operator+() из программы ENGLPLUS. В функции operator+() создается новый объект типа Distance, который будет затем возвращен функци- ей, чтобы быть присвоенным третьему объекту типа Distance:

dist3 = dist1 + dist2;

В функции operator+=() программы ENGLPLEQ объектом, принимающим значе- ние суммы, является объект, вызывающий функцию operator+=(). Поэтому feet и inches являются заданными величинами, а не временными переменными, исполь- зуемыми только для возвращаемого объекта. Функция operator+=() не имеет воз- вращаемого значения: она возвращает тип void. Для операции += возвращаемое значение не требуется, так как мы не присваиваем ее результат никакой пере- менной. Эта операция используется без возвращаемого значения в выражениях, похожих на выражение из нашей программы:

dist1 += dist2;

Но если мы захотим использовать эту операцию в более сложных выражени- ях, таких, как:

dist3 = dist1 += dist2;

то в этом случае нам понадобится возвращаемое значение. Мы можем ввести его, записав в конце определения функции operator+=() строку

return Distance ( feet, inches );

в которой безымянный объект инициализируется тем же значением, что и объ- ект, вызывающий функцию, и затем возвращается.

 

14