Содержание
- 2. Перегрузка операций Перегрузка постфиксной унарной операции Для постфиксной операции характерно то, что в первую очередь операнд
- 3. Перегрузка операций Пример перегрузки постфиксного инкремента. class Test { // … Test operator ++(int) { Test
- 4. Перегрузка операций В данном примере перегрузка осуществлена как составляющая функция класса. Перегрузку через дружественную и внешнюю
- 5. Перегрузка операций Перегрузка бинарных операций Бинарная операция имеет два аргумента. Если она перегружается как составляющая функция
- 6. Перегрузка операций Рассмотрим пример бинарной операции сравнения на больше. class Test { int test; // …
- 7. Перегрузка операций После такой перегрузки можно сравнивать два объекта типа Test: Test tst_1(10), tst_2(2); //… if(tst_1
- 8. Перегрузка операций Если бинарная операция перегружается как внешняя функция, ей необходимо передать два параметра. bool operator
- 9. Перегрузка операций Перегрузку через дружественную функцию попробуйте сделать самостоятельно. Перегрузка бинарных арифметических операций Бинарные арифметические операций:
- 10. Перегрузка операций Если левый операнд перегружаемой бинарной операции представляет собой не пользовательский тип, а один из
- 11. Перегрузка операций Например, class Test { public: double test; Test(){}; Test(double t):test(t){}; friend ostream &operator };
- 12. Перегрузка операций ostream &operator { out return out; } Test operator +(double d, Test &t) {
- 13. Перегрузка операций Пример использования: int main() { double d=3.22; Test t(5.46); cout return 0; }
- 14. Перегрузка операций (2 сем)Перегрузка операции присваивания и инициализации Говоря о перегрузке операций, нельзя не отметить, что
- 15. Перегрузка операций Операция присваивания определяется как операция поэлементного копирования полей одного объекта в поля другого (метод
- 16. Перегрузка операций Чтобы сохранить семантику присваивания, операция-функция должна возвращать ссылку на объект, для которого она вызвана,
- 17. Перегрузка операций Рассмотрим конкретный пример: class Test { double *test; public: Test(){}; Test(double); ~Test(){ delete test;
- 18. Перегрузка операций Конструктор класса: Test::Test(double d) { test = new double; // поле в динамической области
- 19. Перегрузка операций Операция присваивания: Test &Test::operator=(const Test &t) { cout if(&t == this) return *this; if(!test)
- 20. Перегрузка операций Использование перегруженной операции присваивания: int main() { Test tst_1(100); Test tst_2; tst_2 = tst_1;
- 21. Перегрузка операций Еще раз: tst_2 = tst_1; работает перегруженная операция присваивания, но Test tst_3 = tst_1;
- 22. Перегрузка операций Операция индексирования Операция индексирования [] перегружается когда тип класса представляет множество значений, для которого
- 23. Перегрузка операций Рассмотрим пример. class Vect { int *p; int size; public: explicit Vect(int n =
- 24. Перегрузка операций Конструкторы класса: Vect::Vect(int n):size(n) { p = new int[size]; } Vect::Vect(const int a[], int
- 25. Перегрузка операций Операция индексирования: int &Vect::operator [](int i) { cout if(i =size) { cout exit(1); }
- 26. Перегрузка операций Функция вывода: void Vect::Print() { for(int i=0; i cout cout }
- 27. Перегрузка операций Использование операции индексирования: int main() { int arr[] = {11,22,33,44,55,66,77,88,99}; Vect vec(arr, 8); vec.Print();
- 28. Перегрузка операций При использовании константных объектов класса, необходимо переопределить еще одну операцию индексирования. Смысл ее тот
- 29. Перегрузка операций Попытка изменения константного объекта приведет к сообщению: const Vect vec(arr, 8); vec[3] = 37;
- 30. Перегрузка операций Операция индексирования обязательно должна быть составляющей функцией класса. Она считается бинарной, поэтому может стоять
- 31. Перегрузка операций *Операция выбора элемента Операция выбора элемента ‘->’ так же может быть перегружена. Она относится
- 32. Перегрузка операций В качестве результата операция должна возвращать либо объект, либо указатель на объект. К этому
- 33. Перегрузка операций Обычно данную операцию имеет смысл перегружать в том случае, когда иерархия классов сильно разветвлена.
- 34. Перегрузка операций struct L1 { N *target; N *operator->() const { return target; } }; struct
- 35. Перегрузка операций Использование перегруженных операций: int main() { N x = { 3 }; L1 y
- 36. Перегрузка операций Если изменить перегруженную операцию класса struct L2 следующим образом: L1 &operator->() const { if(target
- 37. Перегрузка операций Тогда при объявлении N x = { }; L1 y = { }; L2
- 38. Перегрузка операций Перегрузка операции приведения типа Существует возможность определить функцию-операцию, которая будет осуществлять преобразование объектов класса
- 39. Перегрузка операций Рассмотрим несложный пример: class Test { int test; public: Test(){}; Test(int t):test(t){}; operator int()
- 40. Перегрузка операций Использование данного оператора: Test t(190); int i = int(t); cout Или более в «экзотическом»
- 41. Перегрузка операций Перегрузка операции вызова функции Класс в котором определена операция вызова функции, называется функциональным классом.
- 42. Перегрузка операций class if_greater { public: int operator ()(int a, int b) { return a>b; }
- 43. Перегрузка операций Использование данной операции несколько необычно по сравнению с другими операциями: int main() { if_greater
- 44. Перегрузка операций Перегруженная операция вызова функции приводит к важному понятию, используемому во многих языках программирования –
- 45. Перегрузка операций Имя функции — это идентификатор, который неявно приводиться к указателю (как и имя массива).
- 46. Перегрузка операций Посмотрим еще один пример использования функтора, когда в классе перегружается операция (), а потом
- 47. Перегрузка операций class Less { public: bool operator() (const int left, const int right) { return
- 48. Перегрузка операций
- 49. Перегрузка операций
- 50. Перегрузка операций
- 51. Перегрузка операций
- 52. Перегрузка операций
- 53. Перегрузка операций
- 54. Перегрузка операций
- 55. Перегрузка операций
- 56. Перегрузка операций
- 58. Скачать презентацию