Академический Документы
Профессиональный Документы
Культура Документы
Отчет
По лабораторной работе № 3
По дисциплине: С++
Кишинев 2014
Лабораторная работа №3
Тема:Перегрузка операторов
Цели работы:
Теоретические сведения:
Мотивация
Когда заходит разговор об операторах, то чаще всего программисты говорят что, либо
не умеют ими пользоваться, либо никогда их не используют. Причина такого
отношения к операторам состоит в том, что их использование, принося пользу (запись
становится короче), в тоже время усложняют понимание кода, так как не всегда
возможно, либо тяжело отследить какой оператор используется встроенный или
перегруженный. Особенно эта проблема остро стоит перед начинающими
программистами, однако к этому синтаксису легко привыкнуть, после нескольких
упражнений. Самый же главный вопрос состоит в том, так уж необходима перегрузка
операторов? Ответ абсолютно однозначен – необходима. Есть случаи, в которых
просто невозможно без них обойтись. Таковым является оператор присваивания.
Конечно, компилятор сам может создать необходимый код, либо мы можем
определить метод, на пример Assign (Как сделано на Java). Однако, оба эти решения
не идеальны.
Недостаток первого состоит в том, что в этом случае будет использовано побитовое
копирование, что устраивает нас только до тех пор, пока в классе не используются
указатели.
Кроме всего выше сказанного нужно добавить еще несколько слов о перегрузке
операторов:
- нельзя определять один и тот же оператор и как метод класса и как друг класса;
а) Создать класс Date – дата, содержащая поля: день, месяц, год. Определить
операторы "+" и "-", как методы класса, а "++" и "--" в обеих формах (префиксная и
постфиксная) как дружественные функции. Оператор "+" должен позволять
осуществление операции только с переменными встроенного int. (x=y+5;). Должна
быть предусмотрена корректная работа с високосными годами.
Код программы:
#include <iostream>
class Date
{
int day, month, year;
public:
if (year % 4 == 0)
return true;
else
return false;
}
int nDays() //возвращает количество дней в месяце
switch (month)
default: return 0;
Date* t;
t = new Date(*this);
t->day += o.day;
t->month += o.month;
t->year += o.year;
t->day -= t->nDays();
t->month++;
t->month -= 12;
t->year++;
return *t;
Date* t;
t = new Date(*this);
t->day -= o.day;
t->month -= o.month;
t->year -= o.year;
if (t->day < 1)
t->month--;
t->day += t->nDays();
if (t->month < 1)
t->year--;
t->month += 12;
return *t;
};
Date* t;
t = new Date(o);
t->day++;
t->day -= t->nDays();
t->month++;
t->month -= 12;
t->year++;
return *t;
Date *t;
t = new Date(o);
o.day++;
{
o.day -= o.nDays();
o.month++;
o.month -= 12;
o.year++;
return *t;
Date* t;
t = new Date(o);
t->day--;
if (t->day < 1)
t->month--;
t->day += t->nDays();
if (t->month < 1)
t->year--;
t->month += 12;
return *t;
Date* t;
t = new Date(o);
o.day--;
if (o.day < 1)
o.month--;
o.day += o.nDays();
if (o.month < 1)
o.year--;
o.month += 12;
return *t;
cout << "Day: " << o.day << "; Month: " << o.month << "; Year" << o.year << endl;
return out;
int main()
Date* c;
int ch;
while (1)
<< "7. ++a " << "8. ++b " << "0. quit ";
switch (ch)
case 0: exit(0);
delete c;
return 0;
Вывод:
В ходе данной лабораторной работы мы узнали об необходимости перегрузки
операторов. Изучили синтаксис определения операторов, типы операторов и формы
перегрузки.