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

Перегрузка арифметических операций

Читайте также:
  1. Анализ депозитных операций.
  2. Арифметические преобразования при выполнении арифметических операций вида X op Y
  3. Аудит учета кассовых операций.
  4. Влияние хозяйственных операций на статьи и валюту баланса
  5. Документальное оформление операций по движению материально-производственных запасов
  6. Журнал регистрации хозяйственных операций за январь месяц 2014 г.
  7. Журнал хозяйственных операций за отчетный период, руб.

Лекц. № 11. ПЕРЕГРУЗКА ОПЕРАЦИЙ

Содержание. Перегрузка арифметических операций, пример. Перегрузка операции вывода. Перегрузка операции индексации. Перегрузка операции присваивания. Перегрузка операций инкремента и декремента. Перегрузка операции ==.

В предыдущей лекции мы начали обсуждать как в C++ перегружаются операции. Был приведен пример класса комплексных чисел для демонстрации механизма перегрузки арифметических операций.

Как уже говорилось, в C++ операции можно использовать для выполнения действий с операндами, которые имеют тип отличный от типов, определенных в языке для операций по умолчанию., т.е., типов перечисленных при определении той или иной операции.. Только существующие операции могут быть перегружены. Новые операции не создаются. Смысл операции, как правило, сохраняется. Число операндов в новом определении операции должно быть тем же, что и в ее оригинальном определении. По меньшей мере один из операндов перегруженной операции должен иметь пользовательский тип. Приоритет и порядок выполнения операций остается неизменным (как и для встроенных операций) и при перегрузке.

NB: Дополнительно заметим, что операции приведения типов static_cast<>, dynamic_cast<>, reinterpret_cast<>, и const_cast<>, а также “операции” препроцессора # и ## не могут быть перегружены.

Термин “перегрузка операции” не следует понимать как переопределение операции, отменяющее действие встроенных в язык операций, но только как расширение множества объектов, к которым операция становится применимой. Продолжим тему перегрузки операций. Здесь, для удобства, повторяем пример класса Complex, а далее, мы приведем конкретные примеры и для некоторых не арифметических операций (ввод-вывод, индексация, присваивание, и т. п.).

Перегрузка арифметических операций

 

Пример. 10-1.1 Класс Complex и его арифметические операции.

 

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

 

class Complex

{

float re;

float im;

public:

Complex(float r = 0, float i = 0):re(r),im(i){ }

void print() const;

friend const Complex operator+(const Complex& x, const Complex& b);

friend const Complex operator-(const Complex& x, const Complex& b);

friend const Complex operator*(const Complex& x, const Complex& b);

friend const Complex operator/(const Complex& x, const Complex& b);

};

 

void Complex::print() const

{

if (re == 0 && im == 0)

{ cout << 0; }

else if (re!= 0 && im == 0)

{ cout << re; }

else if (re == 0 && im!= 0)

{ cout << im << "i"; }

else

{

cout << re;

(im > 0)? (cout << "+" << im << "i"): (cout << "-" << -im << "i");

}

}

 

inline const Complex operator+(const Complex& x, const Complex& y)

{ return Complex(x.re + y.re, x.im + y.im); }

 

inline const Complex operator-(const Complex& x, const Complex& y)

{ return Complex(x.re - y.re, x.im - y.im); }

 

inline const Complex operator*(const Complex& x, const Complex& y)

{ return Complex(x.re * y.re - x.im * y.im, x.re * y.im + x.im * y.re); }

 

const Complex operator/(const Complex& x, const Complex& y)

{

if (y.re == 0 && y.im == 0)

{

cout << "Divide by 0. Press any key to quit.\n";

getch();

exit(1);

}

 

float den = y.re * y.re + y.im * y.im;

 

return Complex((x.re * y.re + x.im * y.im) / den,

(x.im * y.re - x.re * y.im) / den);

}

 

int main()

{

Complex x(2, 3), y(-1, 3);

 

cout << "x is "; x.print(); cout << endl;

cout << "y is "; y.print(); cout << endl;

 

cout << "x + y is "; (x + y).print(); cout << endl;

cout << "x - y is "; (x - y).print(); cout << endl;

cout << "x * y is "; (x * y).print(); cout << endl;

cout << "x / y is "; (x / y).print(); cout << endl;

return 0;

}

 

Объяснение.

 

(i) Функции (функции-операции), перегружающие операторы +, -, и * определены как inline для экономии вычислительных затрат при их вызове. Функция operator/() не встроенная, т. к. Некоторые компиляторы не разрешают inline-функциям иметь оператор if в своем теле.

 

(ii) Функции, перегружающие операции, принимают в качестве параметров ссылки на константные объекты для того, чтобы избежать копирования при передаче параметров.

 

(iii) Функции, перегружающие операции, возвращают “конструктор” для того, чтобы способствовать оптимизации при возврате значения из функции. Тут мы сталкиваемся с некоторой “семантической трудностью”….См. Т. Павловская, стр. 182-183 о свойствах конструкторов. Конкретнее, если в программе встречается такая конструкция: имя_класса (список параметров), то создается объект без имени, причем список параметров может быть пустым.

 

(iv) Возвращаемое значение в наших функциях перегрузки операций является константным, поэтому возвращаемое значение может быть использовано только как r-value.

 

(v) Функции, перегружающие арифметические операции, объявляют как дружественные функции класса. Но они могли бы быть определены как функции-члены класса (а не как дружественные). Например, операция + могла бы быть перегружена следующим образом:

 

inline const Complex Complex::operator+(const Complex& y) const

{

float real = re + y.re;

float imaginary = im + y.im;

 

return Complex(real, imaginary); // return-value optimization

}

 

В этом определении в явном виде присутствует только один операнд, а именно: второй операнд. Первый операнд передается неявно по указателю this. Обычно, рекомендуют использовать дружественные функции, поскольку тогда операнды в определении ф-ии выглядят симметрично.

 


 


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


<== предыдущая страница | следующая страница ==>
Creating the standby database.| Перегрузка операции индексации

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