Перегрузка операторов. Перегрузка операторов внутри классов. Глобальные переменные. Лекция 6 презентация

Содержание

Слайд 2

Перегрузка операторов Перегрузка операторов позволяет определять поведение встроенных операторов для

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

Перегрузка операторов позволяет определять поведение встроенных операторов для объектов пользовательских

классов.
Какие операторы есть в С++?
Слайд 3

Основные операторы Принимают 1 аргумент int a = -10; int

Основные операторы

Принимают 1 аргумент

int a = -10;
int b = ++a;
// a

= -9; b = -9;
b = a++;
// a = -8; b = -9;

a+=10; // a=a+10;

Операторы для целых чисел, к-рые работают с ними, как с битыми строками.

~010101 = 101010

Побитовые сдвиги:
010101 >> 2 = 000101;
010101 << 2 = 010100

Слайд 4

Поразрядные логические операции C++ И, обозначение: & исключающее ИЛИ, обозначение:

Поразрядные логические операции C++

И, обозначение: &
исключающее ИЛИ, обозначение:  ^
исключающее ИЛИ, обозначение:  |

&

^

|

 0, если хотя бы один

из битов 0. Если оба бита равны 1, то результат 1.

0, если оба бита будут равны, во всех остальных случаях результат равен 1.

0, если оба бита будут равны 0, во всех остальных случаях результат равен 1.

Слайд 5

Другие операторы (разыменование указателя и взятие адреса) p.x; A::f, “,”

Другие операторы

(разыменование указателя и взятие адреса)

p.x; A::f, “,” – оператор последовательного

выполнения b = (a+=d), (a+d); // b = a+d

A[i], a(), a(1,2,”Hello”)

Слайд 6

Перегрузка операторов Унарный оператор Умн-е вектора на число Умн-е числа

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

Унарный оператор

Умн-е вектора на число

Умн-е числа на вектор

Исп-ем реализацию вектора

на число

Если оператор перегружен и внутри, и снаружи, то произойдёт ошибка!

Слайд 7

Перегрузка операторов внутри классов Для перегрузки операторов мы использовали внешние

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

Для перегрузки операторов мы использовали внешние функции, но

можно перегружать операторы и при помощи определения методов.

Нет аргументов

1 аргумент

Оператор умн-я числа на вектор внутри класса определить не получится

Для () может быть произвольное число аргументов, для [] – 1 аргумент

Слайд 8

Перегрузка инкремента и декремента Унарный оператор ++a «заглушка» (чтобы различать

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

Унарный оператор ++a

«заглушка» (чтобы различать постфикс и префикс)

a

= 10;
b = a++;
// b = 10; a=11

Сохраняем тек. зн-е

Вызываем префикс

Вернем временное зн-е

Посфикс «сложнее» - вызов префикса и создание копии

Слайд 9

Переопределение операторов ввода-вывода Поток ввода Возвращаем ссылку на поток ввода

Переопределение операторов ввода-вывода

Поток ввода

Возвращаем ссылку на поток ввода

Поток вывода

Эти операторы всегда

переопределяют как внешние функции – т.к. 1-ый аргумент – поток ввода и вывода
Слайд 10

Операторы с особым порядком вычисления («и», «или», «,») False &&

Операторы с особым порядком вычисления («и», «или», «,»)

False && () =

False

True || () = True

Сначала выполняется 1-ый операнд, но возвращается второй

При перегрузке операторов данный порядок вычислений не гарантируется – все операнды будут вычислены

Вычисление 2-го операнда не будет происходить

Можно проверить с помощью ф-ций

Слайд 11

Переопределение арифметических и битовых операторов Внешняя функция Можно было определить

Переопределение арифметических и битовых операторов

Внешняя функция

Можно было определить как метод

Конструктор приведения

от строки в стиле Си

Эта строчка не скомпилируется, если определить как метод

Слайд 12

“Правильное” переопределение операторов сравнения Определяем только 2 оператора == и

“Правильное” переопределение операторов сравнения

Определяем только 2 оператора == и <

Слайд 13

О чём стоит помнить Оператор + ничего не возвращает? Не

О чём стоит помнить

Оператор + ничего не возвращает?

Не нужно определять +

как *, а / как %.
Чтобы не запутаться

Допустим, ^ - это векторное умн-е.
Но здесь не ясен порядок

Так нельзя, т.к. оба операнда – встроенные типы

Слайд 14

Глобальные переменные Н-р, многопоточные приложения Сложно контролировать зн-е глоб. переменной

Глобальные переменные

Н-р, многопоточные приложения

Сложно контролировать зн-е глоб. переменной

Если несколько глоб. переменных

//

разумно всегда инициализировать (.cpp)

// лучше в заголовочном файле .hpp

Слайд 15

Статические глобальные переменные

Статические глобальные переменные

Слайд 16

Статические локальные переменные next(10) -> 10 next(20) -> 11 Инициализация только 1 раз Пример на слайде

Статические локальные переменные

next(10) -> 10
next(20) -> 11
Инициализация только 1 раз

Пример на

слайде
Слайд 17

Статические функции (внутри модуля) Можно иметь ф-ции с одинаковыми названиями Без слов static - ошибка

Статические функции

(внутри модуля)

Можно иметь ф-ции с одинаковыми названиями
Без слов static -

ошибка
Слайд 18

Статические поля класса Так мы можем посчитать кол-во экземпляров типа

Статические поля класса

Так мы можем посчитать кол-во экземпляров типа User

Инкремент в

конструкторе, декремент в деструкторе

Определять нужно снаружи класса

Слайд 19

Статические методы Есть доступ к закрытым полям класса

Статические методы

Есть доступ к закрытым полям класса

Слайд 20

Ключевое слово inline Вместо вызова ф-ции будет замена на умножение

Ключевое слово inline

Вместо вызова ф-ции будет замена на умножение

Не получится

разделить на определение в заголовочном файле и реализацию в .cpp

Если сложная ф-ция

Слайд 21

Правило одного определения (т.е.одного файла) Ошибка на этапе компиляции Ошибка

Правило одного определения

(т.е.одного файла)

Ошибка на этапе компиляции

Ошибка на этапе линковки

Не

будет ошибки, но будет некорректная программа
Слайд 22

Слайд 23

Вопрос 1

Вопрос 1

Слайд 24

Ответ: 3

Ответ: 3

Слайд 25

Вопрос 2

Вопрос 2

Слайд 26

Вопрос 3

Вопрос 3

Слайд 27

Ответ: 1

Ответ: 1

Слайд 28

Вопрос 4

Вопрос 4

Слайд 29

Ответ: 3

Ответ: 3

Слайд 30

Дружественные классы Данные классы не связаны наследованием Обращение к private-полям класса String

Дружественные классы

Данные классы не связаны наследованием

Обращение к private-полям класса String

Слайд 31

Дружественные функции Оператор вывода Функцию можно не только объявить, но

Дружественные функции

Оператор вывода

Функцию можно не только объявить, но и определить

Получаем

доступ к private-полям класса String
Имя файла: Перегрузка-операторов.-Перегрузка-операторов-внутри-классов.-Глобальные-переменные.-Лекция-6.pptx
Количество просмотров: 57
Количество скачиваний: 0