Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Топ:
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Дисциплины:
2020-05-08 | 430 |
5.00
из
|
Заказать работу |
|
|
Используйте перегруженные операции так же, как и основные. Например, если alpha и beta основного типа, то операция присваивания в выражении
alpha += beta;
присваивает alpha сумму alpha и beta. Любая перегруженная версия этой операции должна выполнять что-либо подобное. Она, возможно, должна делать то же, что и
alpha - alpha + beta: где + перегружен.
Если вы перегружаете одну арифметическую операцию, то вы можете для целостности перегрузить их все. Это предотвратит путаницу.
Некоторые синтаксические характеристики операций не могут быть изменены. Как вы могли заметить, вы не можете перегрузить бинарную операцию в унарную и наоборот.
Показывайте ограничение
Помните, что если вы перегрузили операцию +, то любому человеку, который не знаком с вашим листингом, нужно будет многое изучить, чтобы понять, что выражение
а = b + с;
в действительности означает. Если у вас очень много перегруженных операций, и они используются для не понятных интуитивно целей, то потеряется суть их использования и чтение листинга станет тяжелее вместо того, чтобы стать легче. Используйте перегрузку операций очень аккуратно, только там, где необходимость ее использования очевидна. Вас могут одолеть сомнения, использовать ли функцию взамен перегруженной операции, так как имя функции однозначно. Если вы, скажем, напишете функцию для поиска левой стороны строки, то вам будет лучше вызвать функцию getleft(), чем пытаться перегрузить операцию (например, &&) для тех же целей.
Избегайте неопределенности
Предположим, что вы используете и конструктор с одним аргументом, и операцию преобразования для выполнения некоторого преобразования (например, time24 в timel2). Как компилятор узнает, какое из преобразований выполнять? Никак. Компилятор не следует вовлекать в ситуации, в которых ему не известно, что следует делать, так как он выдаст ошибку. Поэтому избегайте выполнения одного преобразования с помощью нескольких разных способов.
|
Не все операции могут быть перегружены
Следующие операции не могут быть перегружены: операция доступа к членам структуры или класса (.), операция разрешения (::) и операция условия (?:). А также операция (->), с которой мы еще не сталкивались. Кроме того, нельзя создавать новые операции (например, нельзя определить новую операцию возведения в степень **, которая есть в некоторых языках) и пытаться их перегрузить; перегружать можно только существующие операции.
Порядок выполнения работы
1. Изучите теоретический материал.
2. Напишите программу, согласно заданному в варианте задания условию.
3. Ответьте на контрольные вопросы.
ВАРИАНТЫ ЗАДАНИЙ
Вариант. 1
Добавьте в класс Distance из программы ENGLPLUS перегруженную операцию -, которая вычисляет разность двух интервалов. Она должна позволять выполнение выражений типа dist3=distl-dist2;. Предполагаем, что эта операция никогда не будет использоваться для вычитания большего интервала из меньшего (так как отрицательного интервала быть не может).
Вариант. 2
Напишите программу, которая заменяет перегруженную операцию + на перегруженную операцию += в программе STRPLUS. Эта операция должна позволять записывать выражения типа:
si += s2;
где s2 прибавляется (объединяется) к строке si, результат при этом остается в si. Операция должна также позволять использовать результат для других вычислений, например в выражениях типа
s3 = si += s2;
Вариант. 3
Модифицируйте класс time из упражнения 3 главы 6 так, чтобы вместо метода add_time() можно было использовать операцию + для складывания двух значений времени. Напишите программу для проверки класса.
Вариант. 4
Создайте класс Int, основанный на упражнении 1 из главы 6. Перегрузите четыре целочисленных арифметических операции (+, -, * и /) так, чтобы их можно было использовать для операций с объектами класса Int. Если результат какой-либо из операций выходит за границы типа int (в 32- битной системе), имеющие значение от 2 14 7 483 648 до -2 147 483 648, то операция должна послать сообщение об ошибке и завершить программу. Такие типы данных полезны там, где ошибки могут быть вызваны арифметическим переполнением, которое недопустимо. Подсказка: для облегчения проверки переполнения выполняйте вычисления с использованием типа long double. Напишите программу для проверки этого класса.
|
Вариант. 5
Пополните класс time, рассмотренный в упражнении 3, перегруженными операциями увеличения (++) и уменьшения (--), которые работают в обеих, префиксной и постфиксной, формах записи и возвращают значение. Дополните функцию main(), чтобы протестировать эти операции.
Вариант. 6
Добавьте в класс time из упражнения 5 возможность вычитать значения времени, используя перегруженную операцию -, и умножать эти значения, используя тип float и перегруженную операцию *.
Вариант. 7
Модифицируйте класс fraction в четырехфункциональном дробном калькуляторе из упражнения 11 главы 6 так, чтобы он использовал перегруженные операции сложения, вычитания, умножения и деления. (Вспомните правила арифметики с дробями в упражнении 12 главы 3 «Циклы и ветвления».) Также перегрузите операции сравнения == и!= и используйте их для выхода из цикла, когда пользователь вводит 0/1, 0 и 1 значения двух частей дроби. Вы можете модифицировать и функцию lowterms() так, чтобы она возвращала значение ее аргумента, уменьшенное до несократимой дроби. Это будет полезным в арифметических функциях, которые могут быть выполнены сразу после получения ответа.
Вариант. 8
Модифицируйте класс ЬМопеу из упражнения 12 главы 7 «Массивы и строки», включив арифметические операции, выполненные с помощью перегруженных операций:
bМопеу = bМопеу + bМопеу bМопеу = bМопеу - bМопеу
bМопеу = bМопеу * long double (цена за единицу времени, затраченного на изделие) long double = bМопеу / bМопеу (общая цена, деленная на цену за изделие) bМопеу = bМопеу / long double (общая цена, деленная на количество изделий)
Заметим, что операция / перегружена дважды. Компилятор может различить оба варианта, так как их аргументы разные. Помним, что легче выполнять арифметические операции с объектами класса ЬМопеу, выполняя те же операции с его long double данными.
|
Убедитесь, что программа main() запросит ввод пользователем двух денежных строк и числа с плавающей точкой. Затем она выполнит все пять операций и выведет результаты. Это должно происходить в цикле, так, чтобы пользователь мог ввести еще числа, если это понадобится.
Некоторые операции с деньгами не имеют смысла: ЬМопеу*ЬМопеу не представляет ничего реального, так как нет такой вещи, как денежный квадрат; вы не можете прибавить ЬМопеу к long double (что же будет, если рубли сложить с изделиями?). Чтобы сделать это невозможным, скомпилируйте такие неправильные операции, не включая операции преобразования для ЬМопеу в long double или long double в ЬМопеу. Если вы это сделаете и запишете затем выражение типа:
bmon2 = bmonl + widgets; //это не имеет смысла
то компилятор будет автоматически преобразовывать widgets в ЬМопеу и выполнять сложение. Без них компилятор будет отмечать такие преобразования как ошибки, что позволит легче найти концептуальные ошибки. Также сделайте конструкторы преобразований явными.
Вот некоторые другие вероятные операции с деньгами, которые мы еще не умеем выполнять с помощью перегруженных операций, так как они требуют объекта справа от знака операции, а не слева:
long double * ЬМопеу // Пока не можем это сделать: ЬМопеу возможен только справа long double / ЬМопеу // Пока не можем это сделать: ЬМопеу возможен только справа
♦ Вариант. 9
Дополните класс safearray из программы ARR0VER3 этой главы так, чтобы пользователь мог определять и верхнюю, и нижнюю границы массива (например, индексы, начинающиеся с 100 и заканчивающиеся 200). Имеем перегруженную операцию доступа к членам массива, проверяющую индексы каждый раз, когда к массиву нужен доступ, для проверки того, что мы не вышли за пределы массива. Вам понадобится конструктор с двумя аргументами, который определяет верхнюю и нижнюю границы. Так как мы еще не изучили, как выделять память динамически, то данные класса все еще будут размещаться в массиве, состоящем из 100 элементов, но вообще вы можете преобразовывать индексы массива safearray в индексы реального массива целых чисел произвольным образом. Например, если пользователь определил диапазон от 100 до 175, то вы можете преобразовать его в диапазон от агг[0] до агг[75].
|
♦ Вариант. 10
Только для любителей математики: создайте класс Polar, который предназначен для хранения полярных координат (радиуса и угла). Перегрузите операцию + для выполнения сложения для объектов класса Polar. Сложение двух объектов выполняется путем сложения координат X объектов, а затем координат Y. Результат будет координатами новой точки. Таким образом, вам нужно будет преобразовать полярные координаты к прямоугольным, сложить их, а затем обратно преобразовать прямоугольные координаты результата к полярным.
♦ Вариант. 11
Напишите программу, объединяющую в себе классы ЬМопеу из варианта 8 и sterling из упражнения 11. Напишите операцию преобразования для преобразования между классами ЬМопеу и sterling, предполагая, что один фунт (£1.0.0) равен пятидесяти долларам ($50.00). Это приблизительный курс обмена для XIX века, когда Британская империя еще использовала меру фунты-шиллинги-пенсы. Напишите программу main(), которая позволит пользователю вводить суммы в каждой из валют и преобразовывать их в другую валюту с выводом результата. Минимизируйте количество изменений в существующих классах ЬМопеу и sterling.
Форма отчёта: отчет выполняется в текстовом редакторе в электронном виде.
Содержание отчета:
1. Тема работы.
2. Цель работы.
3. Выполненные задания.
Система оценки: пятибальная.
Контрольные вопросы
1. Перегрузка операций:
а) преобразовывает операции(орегаШг) С++ для работы с объектами;
б) предоставляет операциям С++ больше, чем они могут обработать;
в) дает новое значение существующим в С++ операциям;
г) создает новые операции С++.
2. Предположим, что класс X не использует перегруженные операции. Напишите выражение, в котором вычитается объект xl класса X из другого объекта х2 этого же класса. Результат помещается в хЗ.
3. Предположим, что класс X включает в себя процедуру перегрузки операции -. Напишите выражение, которое будет выполнять те же действия, что и выражение, описанное в вопросе 2.
4. Истинно ли следующее утверждение: операция >= может быть перегружена?
5. Запишите полное определение для перегруженной операции в классе Counter программы C0UNTPP1, которая вместо увеличения счетчика уменьшает его.
6. Сколько аргументов требуется для определения перегруженной унарной операции?
7. Предположим, что существует класс С с объектами objl, obj2 и obj3. Выражение obj3=objl-obj2 работает правильно. Здесь перегруженная операция должна: *
а) принимать два аргумента;
б) возвращать значение;
|
в) создавать именованный временный объект;
г) использовать объект, вызвавший операцию, как операнд.
12. Чем отличается действие перегруженной операции ++ при ее использовании в префиксной форме от использования в постфиксной форме?
13. Истинно ли следующее утверждение: перегруженная операция всегда требует на один аргумент меньше, чем количество операндов?
Список использованной литературы
1. Х.Дейтел Как программировать на C; Пер. с англ. под ред. В. Тимофеева. - М.: БИНОМ, 2000. - 1005 с.: ил.; 24
2. Язык программирования С / Брайан Керниган, Деннис Ритчи; [пер. с англ. и ред. В. Л. Бродового]. - 2-е изд., перераб. и доп. - Москва [и др.]: Вильямс, 2007. - 289 с.; 23 см.
3. Бьерн Страуструп Язык программирования C++; Пер. с англ. С. Анисимова и М. Кононова под ред. Ф. Андреева, А. Ушакова. - 3. изд. - М.: Binom Pablishers; СПб.: Нев. диалект, 2004. - 990 с.: ил.; 24 см.
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 11
Тема: «Разработка программ на Си++ с использованием наследования»
Цели:
- определить понятие наследования;
- рассмотреть основные особенности наследования в С++;
- изучить множественное наследование;
Характер занятия: репродуктивный.
Форма организации: индивидуальная.
Обеспечение занятия: тетрадь с лекциями, СИ, компьютер.
Требования к знаниям студентов
Перед выполнением практической работы студент должен
знать:
- понятия класс и объект;
- основные особенности создания и использования классов в языке С++;
- понятия конструктор и деструктор.
после выполнения практической работы студент должен
уметь:
- создавать программы, используя частичное и полное наследование в языке С++;
- использовать множественное наследование;
- избегать случаев неопределенности при множественном наследовании.
Теоретический материал
|
|
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!