Операции арифметического присваивания — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

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

2020-05-08 152
Операции арифметического присваивания 0.00 из 5.00 0 оценок
Заказать работу

Давайте закончим наше изучение перегрузки бинарных операций на примере арифметического присваивания: +=. Вспомним, что эта операция выполняет при­сваивание и сложение за один шаг. Мы будем использовать эту операцию для сложения интервалов, записывая результат в переменную, обозначающую пер­вый интервал. Это похоже на пример 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 ()

{ 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 << "\ndistl = ";

dist1.showdist ();

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

cout << "\ndist2 = ";

dist2.showdist ();

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

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

cout << "\ndist1 = ";

dist1.showdist ();

cout << endl;

return 0;

}

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

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

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

distl += dist2:

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

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

dist3 = distl + dist2;

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

distl += dist2:

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

dist3 - distl +- dist2:

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

return Distance (feet, inches):

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

 

Операция индексации массива ([])

Операция индексации, которая обычно используется для доступа к элементам массива, может быть перегружена. Это полезно в том случае, если вы хотите изменить способ работы С++ с массивами. Например, если вам понадобится создать «безопасный массив», в котором заложена автоматическая проверка ис­пользуемого для доступа к массиву индекса элемента. Она будет проверять, на­ходитесь ли вы в границах массива.

Для демонстрации перегрузки операции индексации массива мы должны вернуться к другой теме, с которой мы уже встречались в главе 5, — возвращению значений из функции по ссылке. Перегруженная операция индексации должна возвращать свои значения по ссылке. Чтобы показать, почему это так, мы рас­смотрим три программы, которые реализуют «безопасный» массив, каждая при этом использует свой подход для вставки и считывания элементов массива:

два отдельных метода put() и get();

метод access(), использующий возвращение по ссылке;

перегруженная операция [ ], использующая возвращение по ссылке.

Все три программы используют класс safearray, в котором определен массив, состоящий из 100 элементов типа int. И все три проверяют, находится ли эле­мент, к которому мы хотим получить доступ, в границах массива. Функция mainQ каждой из программ заполняет массив значениями (каждое из которых равно значению индекса массива, умноженному на 10) и затем выводит их все, чтобы показать, что пользователь сделал все правильно.

Два отдельных метода put() и get()

В первой программе мы используем для доступа к элементам массива два мето­да: putel() для вставки элемента в массив и getel() для получения значения нуж­ного нам элемента. Оба метода проверяют, чтобы значение индекса массива вхо­дило в рамки границ массива. То есть оно не должно быть меньше 0 и больше размера массива (минус 1). Приведем листинг программы ARR0VER1.

// arroverl.cpp

// демонстрация создания безопасного массива, проверяющего

// свои индексы при использовании

// используются отдельные функции для установки и получения значения

#include <iostream>

using namespace std;

#include <process.h> // для функции exit

const int LIMIT = 100; // размер массива

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

class safearray

{

private:

int arr [ LIMIT ];

public:

// установка значения элемента массива

void putel (int n, int elvalue) {

if (n < 0 || n >= LIMIT)

{ cout << "\n0 шибочный индекс!";

exit (1); }

arr [ n ] = elvalue;

}

// получение значения элемента массива

int getel (int n) const {

if (n < 0 || n >= LIMIT)

{ cout << "\n Ошибочный индекс!";

exit (1); }

return arr [ n ];

}

};

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

int main ()

{

safearray sal;

// задаем значения элементов

for (int j = 0; j < LIMIT; j++)

sal.putel (j, j * 10);

// показываем элементы

for (int j = 0; j < LIMIT; j++)

{

int temp = sal.getel (j);

cout <<" Элемент " <<j << " равен " << temp << endl;

}

return 0;

}

Данные помещаются в массив с помощью метода putel() и выводятся на дис­плей с помощью метода getel(). Безопасность массива реализована с помощью вывода сообщения об ошибке при попытке использования индекса, не входяще­го в границы массива. Однако этот формат несколько груб.


Поделиться с друзьями:

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.016 с.