Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Введите координаты точки A

Читайте также:
  1. IX. СРОКИ ПРОВЕДЕНИЯ И КООРДИНАТЫ ОРГКОМИТЕТА ФЕСТИВАЛЯ-КОНКУРСА
  2. А. Точки кризиса
  3. Введите координаты точки A
  4. Выбор точки зрения и параметры углов
  5. Глава 4: Кто на самом деле дергает за ниточки?
  6. Говорение на языках с точки зрения его апологетов

x = 3

y = 4 Координаты точки A x = 3 y = 4 Расстояние от точки до начала координат = 5

Если операторная функция унарного оператора объявляется как глобальная, она должна быть объ­явлена в виде:

friend <FuncType> operator X (<Type> <Par>);

где

<FuncType> тип возвращаемого функцией значения;

X перегружаемый оператор;

<Type> тип параметра;

<Par> параметр.

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

friend Dot & operator ~ (Dot & D); // перегрузка оператора "дополнение до единицы"

friend Dot & operator + (Dot & D); // перегрузка оператора "плюс"

friend double operator! (Dot & D); // перегрузка оператора "восклицательный знак"

Для рассматриваемого примера реализация этих функций может быть следующей:

Dot & operator ~ (Dot & D) {

char S [ ] = "Координаты точки "; CharToOem (S, S);

cout<<S<<A.name<<"\tx = "<<D.x<<"\ty = "<<D.y<<'\n';

return D; }

Dot & operator + (Dot & D) {

char S [ ] = "Введите координаты точки "; CharToOem (S, S);

cout<<S<<D.name<<'\n';

cout<<"\tx = "; cin>>D.x; cout<<"\ty = "; cin>>D.y;

return A; }

double operator! (Dot & D) {

Объектно-ориентированное программирование

return sqrt (D.x*D.x + D.y*D.y);


Лекция 8 Перегрузка операторов 4

}

Результат работы программы с перегруженными таким образом операторами будет тем же.

Перегрузка оператора присваивания

Оператор присваивания является бинарным, однако процедура его перегрузки имеет ряд особенно­стей:

> операторная функция оператора присваивания не может быть объявлена как глобальная функция (функция, не являющаяся членом класса);

> операторная функция оператора присваивания не наследуется производным классом;

> компилятор может сгенерировать операторную функцию оператора присваивания, если она не определена в классе.

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

Хотя в нашем классе Dot указатели отсутствуют, но класс содержит константный член name, который не может изменяться после инициализации. Поэтому оператор присваивания по умолчанию будет вызы­вать синтаксическую ошибку.

Необходимо отметить, что левый операнд после выполнения оператора присваивания меняется, так как ему присваивается новое значение. Поэтому функция оператора присваивания должна возвращать ссылку на объект, для которого она вызвана (и которому присваивается значение), если мы хотим сохра­нить семантику оператора присваивания для встроенных типов данных. Проще всего это сделать, возвра­тив разыменованный указатель this. Это, в частности, позволяет использовать перегруженный оператор присваивания в выражениях следующего вида: Dl = D2 = D3;

Следующий пример иллюстрирует, как осуществляется перегрузка оператора присваивания:

Файл Doth

class Dot // класс точки

{

• • •

public:

Dot& operator = (Dot & R); // перегрузка оператора присваивания

};

Файл Dotcpp include ”Doth”

• • •

// реализация перегруженного оператора присваивания

Dot & Dot:: operator = (Dot & R) {

if (this == &R) return *this;

x = R.x; у = R.y;

return "this;

}

Заметим, что при реализации перегруженного оператора необходимо проводить проверку на при­сваивание самому себе. Если в коде программы встретится строка вида

D = D;

или, что гораздо более вероятно, нечто вроде следующего:

Coord D, *pD; D = *рD;

При этом произойдет присваивание самому себе, связанное с ошибкой в программе.

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

В приведенном выше примере функция operator = () содержит инструкцию if (this = &R) return *this;

Здесь идентификатор R используется для обозначения операнда, расположенного в правой части оператора присваивания.



Объектно-ориентированное программирование


Лекция 8 Перегрузка операторов 5


Дата добавления: 2015-11-26; просмотров: 117 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.008 сек.)