История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Топ:
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Интересное:
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Дисциплины:
2020-05-08 | 155 |
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(). Безопасность массива реализована с помощью вывода сообщения об ошибке при попытке использования индекса, не входящего в границы массива. Однако этот формат несколько груб.
|
|
|
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!