SlideShare a Scribd company logo
Программирование на языке C++
Лекция 5
Перегрузка операторов
Александр Смаль
1/10
Основные операторы
Арифметические
∙ Унарные: префиксные + - ++ --, постфиксные ++ --
∙ Бинарные: + - * / % += -= *= /= %=
Битовые
∙ Унарные: ~.
∙ Бинарные: & | ^ &= |= ^= >> <<.
Логические
∙ Унарные: !.
∙ Бинарные: && ||.
∙ Сравнения: == != > < >= <= 2/10
Другие операторы
1. Оператор присваивания: =
2. Специальные:
∙ префиксные * &,
∙ постфиксные -> ->*,
∙ особые , . ::
3. Скобки: [] ()
4. Оператор приведения (type)
5. Тернарный оператор: x ? y : z
6. Работа с памятью: new new[] delete delete[]
Нельзя перегружать операторы . :: и тернарный оператор.
3/10
Перегрузка операторов
Vector operator -( Vector const& v) {
return Vector(-v.x, -v.y);
}
Vector operator +( Vector const& v,
Vector const& w) {
return Vector(v.x + w.x, v.y + w.y);
}
Vector operator *( Vector const& v, double d) {
return Vector(v.x * d, v.y * d);
}
Vector operator *( double d, Vector const& v) {
return v * d;
}
4/10
Перегрузка операторов внутри классов
NB: Обязательно для (type) [] () -> ->* =
struct Vector {
Vector operator -() const { return Vector(-x, -y); }
Vector operator -( Vector const& p) const {
return Vector(x - p.x, y - p.y);
}
Vector & operator *=( double d) {
x *= d;
y *= d;
return *this;
}
double operator []( size_t i) const {
return (i == 0) ? x : y;
}
bool operator ()( double d) const { ... }
void operator ()( double a, double b) { ... }
double x, y;
};
5/10
Перегрузка инкремента и декремента
struct BigNum {
BigNum & operator ++() { //prefix
//increment
...
return *this;
}
BigNum operator ++( int) { //postfix
BigNum tmp(* this );
++(* this );
return tmp;
}
...
};
6/10
Переопределение операторов ввода-вывода
#include <iostream >
struct Vector { ... };
std:: istream& operator >>(std:: istream & is ,
Vector & p) {
is >> p.x >> p.y;
return is;
}
std:: ostream& operator <<(std:: ostream &os ,
Vector const& p) {
os << p.x << ’ ’ << p.y;
return os;
}
7/10
Умный указатель
Реализует принцип: “Получение ресурса есть инициализация”
Resource Acquisition Is Initialization (RAII)
struct SmartPtr {
Data & operator *() const {return *data_ ;}
Data * operator ->() const {return data_ ;}
Data * get() const {return data_ ;}
...
private:
Data * data_;
};
bool operator ==( SmartPtr const& p1 ,
SmartPtr const& p2) {
return p1.get() == p2.get ();
}
8/10
Оператор приведения
struct String {
operator bool () const {
return size_ != 0;
}
operator char const *() const {
if (* this)
return data_;
return "";
}
private:
char * data_;
size_t size_;
};
9/10
Операторы с особым порядком вычисления
int main () {
int a = 0;
int b = 5;
(a != 0) && (b = b / a);
(a == 0) || (b = b / a);
foo() && bar ();
foo() || bar ();
foo(), bar ();
}
// no lazy semantics
Tribool operator &&( Tribool const& b1 ,
Tribool const& b2) {
...
}
10/10

More Related Content

What's hot

2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
DEVTYPE
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
DEVTYPE
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
DEVTYPE
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методы
DEVTYPE
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
Platonov Sergey
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5Zhanna Kazakova
 
Огранизация ввода и вывода данных
Огранизация ввода и вывода данныхОгранизация ввода и вывода данных
Огранизация ввода и вывода данных
Andrey Dolinin
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
mcroitor
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
Ilia Shishkov
 
Erlang
ErlangErlang
6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
DEVTYPE
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
Vasil Remeniuk
 
Программирование циклических алгоритмов
Программирование циклических алгоритмовПрограммирование циклических алгоритмов
Программирование циклических алгоритмов
Andrey Dolinin
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Platonov Sergey
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
mcroitor
 

What's hot (20)

2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод2.8 Строки и ввод-вывод
2.8 Строки и ввод-вывод
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методы
 
лекция 3
лекция 3лекция 3
лекция 3
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5
 
Огранизация ввода и вывода данных
Огранизация ввода и вывода данныхОгранизация ввода и вывода данных
Огранизация ввода и вывода данных
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Erlang
ErlangErlang
Erlang
 
6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Программирование циклических алгоритмов
Программирование циклических алгоритмовПрограммирование циклических алгоритмов
Программирование циклических алгоритмов
 
Array Work C
Array Work CArray Work C
Array Work C
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
 

Viewers also liked

2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
DEVTYPE
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. Streams
DEVTYPE
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивы
DEVTYPE
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
DEVTYPE
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
DEVTYPE
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
DEVTYPE
 
6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблонов
DEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
DEVTYPE
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
DEVTYPE
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friend
DEVTYPE
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 Константность
DEVTYPE
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование
DEVTYPE
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
DEVTYPE
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
DEVTYPE
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
DEVTYPE
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классы
DEVTYPE
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступа
DEVTYPE
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
DEVTYPE
 

Viewers also liked (18)

2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. Streams
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивы
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблонов
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friend
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 Константность
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
 
3.4 Объекты и классы
3.4 Объекты и классы3.4 Объекты и классы
3.4 Объекты и классы
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступа
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
 

Similar to 5.1 Перегрузка операторов

Step cpp022
Step cpp022Step cpp022
Step cpp022
Evgenij Laktionov
 
Ecma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoEcma script 6 yevhen diachenko
Ecma script 6 yevhen diachenko
Denis Khabrenko
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
Fedor Vompe
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкетаstudent_kai
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow September
Alexander Zimin
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
OdessaFrontend
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Swift School #4
Swift School #4Swift School #4
Swift School #4
Sergey Pronin
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlOleksandr Petrov
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo
 

Similar to 5.1 Перегрузка операторов (20)

Step cpp022
Step cpp022Step cpp022
Step cpp022
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
 
Lecture 8
Lecture 8Lecture 8
Lecture 8
 
лекция 2
лекция 2лекция 2
лекция 2
 
лекция 2
лекция 2лекция 2
лекция 2
 
Ecma script 6 yevhen diachenko
Ecma script 6 yevhen diachenkoEcma script 6 yevhen diachenko
Ecma script 6 yevhen diachenko
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow September
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
лекция 1
лекция 1лекция 1
лекция 1
 
Swift School #4
Swift School #4Swift School #4
Swift School #4
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher Sql
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
 

More from DEVTYPE

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
DEVTYPE
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
DEVTYPE
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
DEVTYPE
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
DEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
DEVTYPE
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
DEVTYPE
 
Recurrences
RecurrencesRecurrences
Recurrences
DEVTYPE
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
DEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
DEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
DEVTYPE
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
DEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
DEVTYPE
 
Кучи
КучиКучи
Кучи
DEVTYPE
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
DEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
DEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
DEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
DEVTYPE
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
DEVTYPE
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
DEVTYPE
 
О-символика
О-символикаО-символика
О-символика
DEVTYPE
 

More from DEVTYPE (20)

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
 
Recurrences
RecurrencesRecurrences
Recurrences
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Кучи
КучиКучи
Кучи
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 

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

  • 1. Программирование на языке C++ Лекция 5 Перегрузка операторов Александр Смаль 1/10
  • 2. Основные операторы Арифметические ∙ Унарные: префиксные + - ++ --, постфиксные ++ -- ∙ Бинарные: + - * / % += -= *= /= %= Битовые ∙ Унарные: ~. ∙ Бинарные: & | ^ &= |= ^= >> <<. Логические ∙ Унарные: !. ∙ Бинарные: && ||. ∙ Сравнения: == != > < >= <= 2/10
  • 3. Другие операторы 1. Оператор присваивания: = 2. Специальные: ∙ префиксные * &, ∙ постфиксные -> ->*, ∙ особые , . :: 3. Скобки: [] () 4. Оператор приведения (type) 5. Тернарный оператор: x ? y : z 6. Работа с памятью: new new[] delete delete[] Нельзя перегружать операторы . :: и тернарный оператор. 3/10
  • 4. Перегрузка операторов Vector operator -( Vector const& v) { return Vector(-v.x, -v.y); } Vector operator +( Vector const& v, Vector const& w) { return Vector(v.x + w.x, v.y + w.y); } Vector operator *( Vector const& v, double d) { return Vector(v.x * d, v.y * d); } Vector operator *( double d, Vector const& v) { return v * d; } 4/10
  • 5. Перегрузка операторов внутри классов NB: Обязательно для (type) [] () -> ->* = struct Vector { Vector operator -() const { return Vector(-x, -y); } Vector operator -( Vector const& p) const { return Vector(x - p.x, y - p.y); } Vector & operator *=( double d) { x *= d; y *= d; return *this; } double operator []( size_t i) const { return (i == 0) ? x : y; } bool operator ()( double d) const { ... } void operator ()( double a, double b) { ... } double x, y; }; 5/10
  • 6. Перегрузка инкремента и декремента struct BigNum { BigNum & operator ++() { //prefix //increment ... return *this; } BigNum operator ++( int) { //postfix BigNum tmp(* this ); ++(* this ); return tmp; } ... }; 6/10
  • 7. Переопределение операторов ввода-вывода #include <iostream > struct Vector { ... }; std:: istream& operator >>(std:: istream & is , Vector & p) { is >> p.x >> p.y; return is; } std:: ostream& operator <<(std:: ostream &os , Vector const& p) { os << p.x << ’ ’ << p.y; return os; } 7/10
  • 8. Умный указатель Реализует принцип: “Получение ресурса есть инициализация” Resource Acquisition Is Initialization (RAII) struct SmartPtr { Data & operator *() const {return *data_ ;} Data * operator ->() const {return data_ ;} Data * get() const {return data_ ;} ... private: Data * data_; }; bool operator ==( SmartPtr const& p1 , SmartPtr const& p2) { return p1.get() == p2.get (); } 8/10
  • 9. Оператор приведения struct String { operator bool () const { return size_ != 0; } operator char const *() const { if (* this) return data_; return ""; } private: char * data_; size_t size_; }; 9/10
  • 10. Операторы с особым порядком вычисления int main () { int a = 0; int b = 5; (a != 0) && (b = b / a); (a == 0) || (b = b / a); foo() && bar (); foo() || bar (); foo(), bar (); } // no lazy semantics Tribool operator &&( Tribool const& b1 , Tribool const& b2) { ... } 10/10