Вы находитесь на странице: 1из 11

Технический Университет Молдовы

Кафедра Информационных Технологий

Отчет

По лабораторной работе № 3
По дисциплине: С++

Тема: Перегрузка операторов.

Выполнил ст. гр. MN-132: Хорозов А.


Проверила: Кожокару С.

Кишинев 2014

Лабораторная работа №3

Тема:Перегрузка операторов

Цели работы:

· изучение необходимости перегрузки операторов;

· изучение синтаксиса определения операторов;

· изучение типов операторов;

· изучение форм перегрузки;

Теоретические сведения:

Мотивация

Когда заходит разговор об операторах, то чаще всего программисты говорят что, либо
не умеют ими пользоваться, либо никогда их не используют. Причина такого
отношения к операторам состоит в том, что их использование, принося пользу (запись
становится короче), в тоже время усложняют понимание кода, так как не всегда
возможно, либо тяжело отследить какой оператор используется встроенный или
перегруженный. Особенно эта проблема остро стоит перед начинающими
программистами, однако к этому синтаксису легко привыкнуть, после нескольких
упражнений. Самый же главный вопрос состоит в том, так уж необходима перегрузка
операторов? Ответ абсолютно однозначен – необходима. Есть случаи, в которых
просто невозможно без них обойтись. Таковым является оператор присваивания.
Конечно, компилятор сам может создать необходимый код, либо мы можем
определить метод, на пример Assign (Как сделано на Java). Однако, оба эти решения
не идеальны.

Недостаток первого состоит в том, что в этом случае будет использовано побитовое
копирование, что устраивает нас только до тех пор, пока в классе не используются
указатели.

Кроме всего выше сказанного нужно добавить еще несколько слов о перегрузке
операторов:

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


операции;

- нельзя определять один и тот же оператор и как метод класса и как друг класса;

Аренда хостинга для сайта


zomro.com

Есть противопоказания. Посоветуйтесь с врачом. Продавец: ТМ АРМЕД. Адрес: Россия,


Москва, деревня Николо-Хованское, поселение Сосенское, влад. 1009. ОГРН:
1185476017110
Операционный стол АРМЕД
armed.ru

- все операторы должны возвращать результат типа отличного от void; исключение


operator();

- приоритет операторов не меняется;

- operator() может иметь любое количество аргументов, то есть он не подпадает под


обычную классификацию операторов.
Вариант 4:

а) Создать класс Date – дата, содержащая поля: день, месяц, год. Определить
операторы "+" и "-", как методы класса, а "++" и "--" в обеих формах (префиксная и
постфиксная) как дружественные функции. Оператор "+" должен позволять
осуществление операции только с переменными встроенного int. (x=y+5;). Должна
быть предусмотрена корректная работа с високосными годами.

Код программы:

#include <iostream>

using namespace std;

class Date

{
int day, month, year;

public:

Date() : day(0), month(0), year(0) {};

Date(int d, int m, int y) : day(d), month(m), year(y) {};

Date(const Date& o) : day(o.day), month(o.month), year(o.year) {};

~Date() { day = 0; month = 0; year = 0; };

bool leap() //високосный

if (year % 4 == 0)

return true;

else

return false;

}
int nDays() //возвращает количество дней в месяце

switch (month)

case 1: return 31;

case 2: if (leap()) return 29; else return 28;

case 3: return 31;

case 4: return 30;

case 5: return 31;

case 6: return 30;

case 7: return 31;

case 8: return 31;

case 9: return 30;

case 10: return 31;

case 11: return 30;

case 12: return 31;

default: return 0;

Date& operator+ (const Date& o)

Date* t;

t = new Date(*this);
t->day += o.day;

t->month += o.month;

t->year += o.year;

for (int x = 0; x < 3; x++)

if (t->day > t->nDays())

t->day -= t->nDays();

t->month++;

if (t->month > 12)

t->month -= 12;

t->year++;

return *t;

Date& operator- (const Date& o)

Date* t;

t = new Date(*this);

t->day -= o.day;

t->month -= o.month;
t->year -= o.year;

for (int x = 0; x < 3; x++)

if (t->day < 1)

t->month--;

t->day += t->nDays();

if (t->month < 1)

t->year--;

t->month += 12;

return *t;

friend Date& operator++(Date&);

friend Date& operator++(Date&, int);

friend Date& operator--(Date&);

friend Date& operator--(Date&, int);

friend ostream& operator<<(ostream&, Date&);

};

Date& operator++ (Date& o)


{

Date* t;

t = new Date(o);

t->day++;

if (t->day > t->nDays())

t->day -= t->nDays();

t->month++;

if (t->month > 12)

t->month -= 12;

t->year++;

return *t;

Date& operator++ (Date& o, int z)

Date *t;

t = new Date(o);

o.day++;

if (o.day > o.nDays())

{
o.day -= o.nDays();

o.month++;

if (o.month > 12)

o.month -= 12;

o.year++;

return *t;

Date& operator-- (Date& o)

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& operator-- (Date& o, int z)

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;

ostream& operator<<(ostream& out, Date& o)

cout << "Day: " << o.day << "; Month: " << o.month << "; Year" << o.year << endl;
return out;

int main()

Date a(21, 12, 2012), b(28, 8, 1994);

Date* c;

int ch;

while (1)

cout << "1. a + b " << "2. a - b "

<< "3. b + a " << "4. b - a "

<< "5. a++ " << "6. b++ "

<< "7. ++a " << "8. ++b " << "0. quit ";

cin >> ch;

switch (ch)

case 0: exit(0);

case 1: c = new Date(a + b); cout << *c; break;

case 2: c = new Date(a - b); cout << *c; break;

case 3: c = new Date(b + a); cout << *c; break;

case 4: c = new Date(b - a); cout << *c; break;

case 5: c = new Date(a++); cout << *c; break;


case 6: c = new Date(b++); cout << *c; break;

case 7: c = new Date(++a); cout << *c; break;

case 8: c = new Date(++b); cout << *c; break;

default: c = new Date(7, 1, 0); cout << "Error! "; break;

delete c;

return 0;

Скриншот работы программы:

Вывод:
В ходе данной лабораторной работы мы узнали об необходимости перегрузки
операторов. Изучили синтаксис определения операторов, типы операторов и формы
перегрузки.