Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_ООП_ИС.doc
Скачиваний:
355
Добавлен:
09.02.2015
Размер:
611.84 Кб
Скачать

Void dat::next()

{

day++;

if (day > days[month])

{

if ((month == 2) && (day == 29) && (year%4 == 0)) return;

day=1; month++;

if (month == 13)

{

month=1; year++;

};

};

};

//------ Операция инкремента даты -------------------------

// 1. Первый операнд по указателю this

// 2. Возвращает копию входного объекта (операнда)

// до увеличения

// 3. Соответствует операции dat++ (увеличение после

// использования)

// 4. Замечание: для унарных операций типа -- или ++

// использование их до или после операнда не имеет

// значения (вызывается одна и та же функция).

dat dat::operator++()

{ // Создается временный объект

dat x = *this; // В него копируется текущий объект

next(); // Увеличивается значение текущего объекта

return(x); // Возвращается временный объект по

}; // значению

//------ Операция "дата + целое" --------------------------

// 1. Первый операнд по указателю this

// 2. Входной объект не меняется, результат возвращается

// в виде значения автоматического объекта x

dat dat::operator+(int n)

{

dat x;

x = *this; // Копирование текущего объекта в x

while (n-- !=0) x.next(); // Вызов функции next для объекта x

return(x); // Возврат объекта x по значению

};

//------ Операция "целое + дата" -------------------------

// 1. Дружественная функция с полным списком операндов

// 2. Второй операнд класса dat - передается по значению,

// поэтому может модифицироваться без изменения исходного

// объекта

dat operator+(int n, dat p)

{

while (n-- !=0) p.next(); // Вызов функции next для p

return(p); // Возврат копии объекта p

};

Void main()

{

int i;

dat a, b(17,12,1990), c(12,7), d(3), e;

dat *p = new dat[10];

e = a++;

d = b+15;

for (i=0; i<10; i++) p[i] = p[i] + i;

delete [10] p;

};

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

//------ Операция "дата + целое" --------------------------

// 1. Функция с неявным первым операндом по указателю this

// 2. Меняется значение текущего объекта

// 3. Результат - ссылка на текущий объект

dat& dat::operator+ (int n)

{

while (n-- !=0) next(); // Вызов next с текущим объектом

return(*this); // Возврат ссылки на объект this

};

//------ Операция "дата + целое" -------------------------

// 1. Дружественная функция с полным списком аргументов

// 2. Первый операнд класса dat - ссылка, меняется при

// выполнении операции

// 3. Результат - ссылка на операнд

dat& operator+ (dat& p,int n)

{

while (n-- !=0) p.next(); // Вызов next для объекта p,

// заданного ссылкой

return(p); // Возврат ссылки на p

};

//----- Операция "целое + дата" --------------------------

// 1. Дружественная функция с полным списком аргументов

// 2. Второй операнд класса dat - ссылка, меняется при

// выполнении операции

// 3. Результат - ссылка на операнд

//--------------------------------------------------------

dat& operator+ (int n, dat& p)

{

while (n-- !=0) p.next(); // Вызов next для объекта p,

// заданного ссылкой

return(p); // Возврат ссылки на p

};