Информатика и технология программирования


Переопределение операторов - часть 4



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


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


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


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


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


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


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


dat&#38 operator+(int n, dat&#38 p)
{
while (n-- !=0) p.next(); // Вызов next для объекта p, заданного ссылкой


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


}


void main()
{
dat a,b; // "Арифметические" эквиваленты


a + 2 + 3; 5 + b + 4; // a = a + 2; a = a + 3; b = 5 + b; b = b + 4;


}

Во всех трех случаях ссылка на операнд -объект класса возвращается в качестве результата. Все действия, выполняемые операцией, реализуются в том же объекте, который "накапливает" результат.

Естественный "арифметический" вид переопределяемых операций получается, когда результат возвращается по значению не в виде ссылки, а в виде объекта:


//------------------------------------------------------bk73-05.cpp


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


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


// 2. Изменяется автоматический объект - копия операнда


// 3. Результат - значение автоматического объекта


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


dat dat::operator+(int n)
{
dat tmp = *this; // Объект - копия операнда


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


return(tmp); // Возврат значения объекта tmp


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


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


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


// является копией первого операнда и меняется при


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


// 3. Результат - значение формального параметра


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


dat operator+(dat p,int n)
{
while (n-- !=0) p.next(); // Вызов next для объекта p, копии операнда


return(p); // Возврат значения - формального параметра


}

Во втором случае, когда формальный параметр - операнд передается по значению, он является отдельным объектом, в который копируется объект- фактический параметр. Поэтому его изменение не затрагивает входного операнда. Кроме того, в обоих случаях при возвращении объекта в качестве результата транслятор создает в вызывающей функции временный объект, в который копируется содержимое объекта-результата в операторе return . Дополнительная проблема для таких объектов заключается в их корректном конструировании (см. далее "Конструктор копирования").




Начало  Назад  Вперед



Книжный магазин