Слайды и текст этой онлайн презентации
Слайд 1
Программирование Лекция 6. Перегрузка операторов. Перегрузка операторов внутри классов . Глобальные переменные. Статические переменные и функции. Ключевое слово friend
Слайд 2
Перегрузка операторов Перегрузка операторов позволяет определять поведение встроенных операторов для объектов пользовательских классов. Какие операторы есть в С ?
Слайд 3
Основные операторы Принимают 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
Слайд 4
Поразрядные логические операции C И , обозначение: & исключающее ИЛИ , обозначение: исключающее ИЛИ , обозначение: X Y F 0 0 0 0 1 0 1 0 0 1 1 1 & X Y F 0 0 0 0 1 1 1 0 1 1 1 0 X Y F 0 0 0 0 1 1 1 0 1 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 Сначала выполняется 1-ый операнд, но возвращается второй При перегрузке операторов данный порядок вычислений не гарантируется – все операнды будут вычислены Вычисление 2-го операнда не будет происходить Можно проверить с помощью ф-ций
Слайд 11
Переопределение арифметических и битовых операторов Внешняя функция Можно было определить как метод Конструктор приведения от строки в стиле Си Эта строчка не скомпилируется, если определить как метод
Слайд 12
Правильное переопределение операторов сравнения Определяем только 2 оператора и
Слайд 13
О чём стоит помнить Оператор ничего не возвращает? Не нужно определять как , а / как %. Чтобы не запутаться Допустим, - это векторное умн-е. Но здесь не ясен порядок Так нельзя, т.к. оба операнда – встроенные типы
Слайд 14
Глобальные переменные Н-р, многопоточные приложения Сложно контролировать зн-е глоб. переменной Если несколько глоб. переменных // разумно всегда инициализировать (.cpp) // лучше в заголовочном файле .hpp
Слайд 15
Статические глобальные переменные
Слайд 16
Статические локальные переменные next(10) - 10 next(20) - 11 Инициализация только 1 раз Пример на слайде
Слайд 17
Статические функции (внутри модуля) Можно иметь ф-ции с одинаковыми названиями Без слов static - ошибка
Слайд 18
Статические поля класса Так мы можем посчитать кол-во экземпляров типа User Инкремент в конструкторе, декремент в деструкторе Определять нужно снаружи класса
Слайд 19
Статические методы Есть доступ к закрытым полям класса
Слайд 20
Ключевое слово inline Вместо вызова ф-ции будет замена на умножение Не получится разделить на определение в заголовочном файле и реализацию в .cpp Если сложная ф-ция
Слайд 21
Правило одного определения (т.е.одного файла) Ошибка на этапе компиляции Ошибка на этапе линковки Не будет ошибки, но будет некорректная программа
Слайд 30
Дружественные классы Данные классы не связаны наследованием Обращение к private-полям класса String
Слайд 31
Дружественные функции Оператор вывода Функцию можно не только объявить, но и определить Получаем доступ к private-полям класса String
Слайд 32
Дружественные методы Для одного класса можно определить дружественным метод другого класса Определение метода будет после