Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Интересное:
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Дисциплины:
2020-05-08 | 152 |
5.00
из
|
Заказать работу |
|
|
Давайте закончим наше изучение перегрузки бинарных операций на примере арифметического присваивания: +=. Вспомним, что эта операция выполняет присваивание и сложение за один шаг. Мы будем использовать эту операцию для сложения интервалов, записывая результат в переменную, обозначающую первый интервал. Это похоже на пример 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!