Перегрузка операторов
Перегрузка операторов
Перегрузка операторов
Формальное описание перегрузки операторов
Пример перегрузки оператора в классе
Пример перегрузки оператора вне класса
Какие операторы где переопределять?
Перегрузка операторов сравнения
Перегрузка операторов сравнения
Перегрузка операторов сравнения
Окончание программы
Перегрузка инкремента и декремента
Продолжение программы
Перегрузка логических операторов == и &&
404.63K
Category: programmingprogramming

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

1. Перегрузка операторов

Васильева Лидия Николаевна
доцент кафедры автоматики и управления
в технических системах

2. Перегрузка операторов

Перегрузка операторов позволяет определить для объектов
классов встроенные операторы, такие как +,-, * и т.д.
Для определения оператора для объектов собственного класса,
необходимо определить оператор-функцию operator и символ
перегружаемого оператора.
Функция оператора может быть определена как член класса, либо
вне класса, в том числе при помощи дружественной функции.

3. Перегрузка операторов

Перегрузить можно только операторы, которые определены в C++.
Нельзя
изменить количество операндов оператора, их
ассоциативность, приоритет.
Если функция оператора не является членом класса, то количество ее
параметров совпадает с количеством операндов оператора. Для
унарного оператора- один параметр, бинарного- два параметра. Если у
оператора два операнда, то первый передается первому параметру
функции, а второй операнд- второму параметру. Хотя бы один из
параметров должен иметь тип класса.

4. Формальное описание перегрузки операторов

При перегрузке операторов членами классов
Для бинарного оператора:
ReturnType operator Op(Type right_operand);
Для унарного оператора:
ReturnType& operator Op();
При перегрузке внешними функциями:
Для бинарного оператора
ReturnType operator Op(const ClassType& left_operand, Type right_operand);
или
Для унарного оператора
ReturnType operator Op (Type left_operand, const ClassType& right_operand);
ClassType& operator Op(ClassType& obj);
Op знак оператора

5. Пример перегрузки оператора в классе

6. Пример перегрузки оператора вне класса

7. Какие операторы где переопределять?

Операторы присвоения, индексирования ([]), вызова (()), доступа к
члену класса по указателю (->) следует определять в виде функцийчленов класса.
Операторы, которые изменяют состояние объекта или
непосредственно связаны с объектом (инкремент, декремент),
обычно также определяются в виде функций-членов класса.
Операторы выделения и удаления памяти (new new[] delete delete[])
определяются только в виде функций, которые не являются членами
класса.
Все остальные операторы можно определять вне класса, удобнее
дружественными функциями.

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

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

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

Если речь идет о простом сравнении на основе полей класса, то
для операторов == и != используют специальный оператор default:

11. Окончание программы

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

12. Перегрузка инкремента и декремента

Требуется определить и префиксную, и постфиксную форму
операторов

13. Продолжение программы

14.

Перегрузка
операторов
логических операторов
отношения
При перегрузке операторов отношения и логических
операторов оператор-функции должны возвращать
целое число, означающее true или false.
и

15. Перегрузка логических операторов == и &&

Перегрузка логических операторов == и &&
#include <iostream>
using namespace std;
class drob {
int x, y;
public:
drob() { x = 0; y= 0; }
drob(int i, int j) { x = i; y = j; cout<<x<<"/"<<y<<endl; }
void get_xy(int &i, int &j) { i = x; j = y; }
int operator== (drob ob2);
int operator&&(drob ob2);
};
int drob::operator==(drob ob2) // Перегрузка ==
{return x==ob2.x && y==ob2.y;}
int drob::operator&&(drob ob2) // Перегрузка &&
{return (x && ob2.x) && (y && ob2.y);}

16.

Окончание программы
int main()
{
drob ob1(1, 2), ob2(5, 3), ob3(1, 2), ob4;
if(ob1==ob2) cout << "obl == ob2\n";
else cout << "obl != ob2\n";
if(ob1==ob3) cout << "obl == ob3\n";
else cout << "obl != оb3\n";
if(ob1&&ob2) cout << "obl && ob2 true\n";
else cout << "obl && ob2 false\n";
if(ob1&&ob4) cout << "obl && ob4 true\n";
else cout << "obl && ob4 false\n";
return 0;
}
English     Русский Rules