Использование похожего синтаксиса — КиберПедия 

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Использование похожего синтаксиса

2020-05-08 428
Использование похожего синтаксиса 0.00 из 5.00 0 оценок
Заказать работу

Используйте перегруженные операции так же, как и основные. Например, если 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

Тема: «Разработка программ на Си++ с использованием наследования»

Цели:

- определить понятие наследования;

- рассмотреть основные особенности наследования в С++;

- изучить множественное наследование;

 

Характер занятия: репродуктивный.

Форма организации: индивидуальная.

Обеспечение занятия: тетрадь с лекциями,  СИ, компьютер.

 

Требования к знаниям студентов

Перед выполнением практической работы студент должен

знать:

- понятия класс и объект;

- основные особенности создания и использования классов в языке С++;

- понятия конструктор и деструктор.

 

после выполнения практической работы студент должен

уметь:

- создавать программы, используя частичное и полное наследование в языке С++;

- использовать множественное наследование;

- избегать случаев неопределенности при множественном наследовании.

 

 

Теоретический материал


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

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

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

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...



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

0.036 с.