Программирование
Перегрузка операторов
Основные операторы
Поразрядные логические операции C++
Другие операторы
Перегрузка операторов
Перегрузка операторов внутри классов
Перегрузка инкремента и декремента
Переопределение операторов ввода-вывода
Операторы с особым порядком вычисления («и», «или», «,»)
Переопределение арифметических и битовых операторов
“Правильное” переопределение операторов сравнения
О чём стоит помнить
Глобальные переменные
Статические глобальные переменные
Статические локальные переменные
Статические функции
Статические поля класса
Статические методы
Ключевое слово inline
Правило одного определения
Вопрос 1
Ответ: 3
Вопрос 2
Вопрос 3
Ответ: 1
Вопрос 4
Ответ: 3
Дружественные классы
Дружественные функции
Дружественные методы
4.48M
Category: programmingprogramming

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

1. Программирование

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

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

• Перегрузка операторов позволяет
определять поведение встроенных
операторов для объектов пользовательских
классов.
• Какие операторы есть в С++?

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

int a = -10;
int b = ++a;
Принимают 1 аргумент
// a = -9; b = 9;
b = a++;
// a = -8; b = a+=10; // a=a+10;
9;
Операторы для целых чисел, к-рые работают с ними, как с битыми строками.
~010101 = 101010
Побитовые сдвиги:
010101 >> 2 = 000101;
010101 << 2 = 010100

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

• И, обозначение: &
• исключающее ИЛИ, обозначение: ^
• исключающее ИЛИ, обозначение: |
X
Y
F
X
Y
F
X
Y
F
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
0
1
1
1
0
0
1
0
1
1
0
1
1
1
1
1
1
0
1
1
1
&
0, если хотя бы
один из битов 0.
Если оба бита
равны 1, то
результат 1.
^
|
0, если оба бита
будут равны, во
всех остальных
случаях результат
равен 1.
0, если оба бита
будут равны 0, во
всех остальных
случаях результат
равен 1.

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

(разыменование указателя и взятие адреса)
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 = 10;
b = a++;
// b = 10;
a=11

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

Поток ввода
Возвращаем ссылку на поток ввода
Поток вывода
Эти операторы всегда переопределяют как внешние
функции – т.к. 1-ый аргумент – поток ввода и вывода

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

False && () = False
True || () = True
Вычисление 2-го операнда не
будет происходить
Можно проверить с помощью ф-ций
Сначала выполняется 1-ый операнд, но
возвращается второй
При перегрузке операторов данный порядок вычислений не
гарантируется – все операнды будут вычислены

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

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

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

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

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

Не нужно определять + как *, а / как %.
Чтобы не запутаться
Оператор + ничего не возвращает?
Допустим, ^ - это векторное умн-е.
Но здесь не ясен порядок
Так нельзя, т.к. оба операнда –
встроенные типы

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

// лучше в заголовочном файле .hpp
// разумно всегда инициализировать (.cpp)
Н-р, многопоточные приложения
Сложно контролировать зн-е глоб. переменной
Если несколько глоб. переменных

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

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

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

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

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

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

Так мы можем посчитать кол-во
экземпляров типа User
Инкремент в конструкторе,
декремент в деструкторе
Определять нужно снаружи класса

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

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

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

Вместо вызова ф-ции будет замена на умножение
Не получится разделить на определение в заголовочном
файле и реализацию в .cpp
Если сложная ф-ция

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

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

22.

23. Вопрос 1

24. Ответ: 3

25. Вопрос 2

26. Вопрос 3

27. Ответ: 1

28. Вопрос 4

29. Ответ: 3

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

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

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

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

32. Дружественные методы

Для одного класса можно определить
дружественным метод другого класса
Определение
метода будет после
English     Русский Rules