🗊 Презентация Перегрузка=,(),тип

Категория: Образование
Нажмите для полного просмотра!
Перегрузка=,(),тип, слайд №1 Перегрузка=,(),тип, слайд №2 Перегрузка=,(),тип, слайд №3 Перегрузка=,(),тип, слайд №4 Перегрузка=,(),тип, слайд №5 Перегрузка=,(),тип, слайд №6 Перегрузка=,(),тип, слайд №7 Перегрузка=,(),тип, слайд №8 Перегрузка=,(),тип, слайд №9 Перегрузка=,(),тип, слайд №10 Перегрузка=,(),тип, слайд №11 Перегрузка=,(),тип, слайд №12 Перегрузка=,(),тип, слайд №13 Перегрузка=,(),тип, слайд №14 Перегрузка=,(),тип, слайд №15 Перегрузка=,(),тип, слайд №16 Перегрузка=,(),тип, слайд №17 Перегрузка=,(),тип, слайд №18 Перегрузка=,(),тип, слайд №19 Перегрузка=,(),тип, слайд №20 Перегрузка=,(),тип, слайд №21 Перегрузка=,(),тип, слайд №22 Перегрузка=,(),тип, слайд №23 Перегрузка=,(),тип, слайд №24 Перегрузка=,(),тип, слайд №25 Перегрузка=,(),тип, слайд №26 Перегрузка=,(),тип, слайд №27 Перегрузка=,(),тип, слайд №28 Перегрузка=,(),тип, слайд №29 Перегрузка=,(),тип, слайд №30 Перегрузка=,(),тип, слайд №31 Перегрузка=,(),тип, слайд №32 Перегрузка=,(),тип, слайд №33 Перегрузка=,(),тип, слайд №34 Перегрузка=,(),тип, слайд №35 Перегрузка=,(),тип, слайд №36 Перегрузка=,(),тип, слайд №37 Перегрузка=,(),тип, слайд №38 Перегрузка=,(),тип, слайд №39 Перегрузка=,(),тип, слайд №40 Перегрузка=,(),тип, слайд №41 Перегрузка=,(),тип, слайд №42 Перегрузка=,(),тип, слайд №43 Перегрузка=,(),тип, слайд №44

Содержание

Вы можете ознакомиться и скачать презентацию на тему Перегрузка=,(),тип. Доклад-сообщение содержит 44 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1


2. Перегрузка операции = Если объект использует динамическую область, то для него надо перегрузить операцию ‘= ‘ - присвоение. Рассмотрим почему....
Описание слайда:
2. Перегрузка операции = Если объект использует динамическую область, то для него надо перегрузить операцию ‘= ‘ - присвоение. Рассмотрим почему. Пусть заданы 2 объекта String s1, s2(“ФПМК”); ... s1 = s2;

Слайд 2


Картина присвоения напоминает Картина присвоения напоминает ситуацию с инициализацией (даже хуже): до присвоения
Описание слайда:
Картина присвоения напоминает Картина присвоения напоминает ситуацию с инициализацией (даже хуже): до присвоения

Слайд 3


Это недопустимо по следующим причинам: 1. Память в 80 байтов у объекта s1 будет «брошена» (считаться занятой); 2. объекты s1 и s2 будут использовать...
Описание слайда:
Это недопустимо по следующим причинам: 1. Память в 80 байтов у объекта s1 будет «брошена» (считаться занятой); 2. объекты s1 и s2 будут использовать одну и ту же динамическую память по указателю line, что приведет к тому, что любое изменение в поле line объекта s1 приведет к изменению поля line объекта s2 и наоборот; 3. при выходе из функции деструктор будет пытаться дважды освободить одну и ту же динамическую память: это фатальная ошибка!

Слайд 4


В классах, где используется В классах, где используется динамическая память, операция ‘=’ обязательно перегружается.
Описание слайда:
В классах, где используется В классах, где используется динамическая память, операция ‘=’ обязательно перегружается.

Слайд 5


Пример перегрузки операции = для класса String String & String :: operator =(String &s) { { delete [ ] line;// Важно освободить // динамическую...
Описание слайда:
Пример перегрузки операции = для класса String String & String :: operator =(String &s) { { delete [ ] line;// Важно освободить // динамическую память у *this line = new char [(len = s.len) + 1]; // сразу // определим поле len strcpy(line, s.line); } return *this; }

Слайд 6


Теперь присвоение s1 = s2 будет выполняться грамотно.
Описание слайда:
Теперь присвоение s1 = s2 будет выполняться грамотно.

Слайд 7


Конструктор копирования и операция присвоения = String s(“УРА!”), r(“ФПМК”); String p = s;// работает конструктор копирования … r = s; // работает...
Описание слайда:
Конструктор копирования и операция присвоения = String s(“УРА!”), r(“ФПМК”); String p = s;// работает конструктор копирования … r = s; // работает перегруженная операция =

Слайд 8


Отличие операции = и конструктора копирования Оператор = выполняет 3 действия : 1. Освобождает динамическую память у левого объекта ( её могло быть...
Описание слайда:
Отличие операции = и конструктора копирования Оператор = выполняет 3 действия : 1. Освобождает динамическую память у левого объекта ( её могло быть меньше или больше, чем у правого); 2. берёт новую динамическую память размером её у правого объекта; 3. копирует поля правого объекта в поля левого. Конструктор копирования выполняет 2 действия: 1. Берет динамическую память для левого объекта размером её у правого; 2. копирует поля левого объекта в поля правого.

Слайд 9


Если хотя бы один конструктор берёт динамическую память, то обязательно возникают: Если хотя бы один конструктор берёт динамическую память, то...
Описание слайда:
Если хотя бы один конструктор берёт динамическую память, то обязательно возникают: Если хотя бы один конструктор берёт динамическую память, то обязательно возникают: Деструктор Конструктор копирования Оператор =

Слайд 10


3. Перегрузка операции () Если объект - матрица, то для обращения к ее элементам нельзя перегрузить [][]. В этом случае можно использовать перегрузку...
Описание слайда:
3. Перегрузка операции () Если объект - матрица, то для обращения к ее элементам нельзя перегрузить [][]. В этом случае можно использовать перегрузку операции (). class Matrix{ int **a, m, n; public: Matrix( int m1 = 1, int n1 = 1, int t = 0, int d = 10); // конструктор с аргументами по умолчанию ~Matrix(); void Show(); // вывод матрицы int & operator()(int, int); ... };

Слайд 11


Конструктор Matrix::Matrix(int mm, int nn, int t, int d) // mm – строк, nn – столбцов, d - диапозон // t != 0 – генерировать случайные числа {int i,...
Описание слайда:
Конструктор Matrix::Matrix(int mm, int nn, int t, int d) // mm – строк, nn – столбцов, d - диапозон // t != 0 – генерировать случайные числа {int i, j; m = mm; n = nn; a = new int * [m]; for( i = 0; i < m; i++) a[i] = new int [n]; if(t) for(i = 0; i < m; i++) for(j = 0; j < n; j++) a[i][j] = rand()%d; }

Слайд 12


Перегрузка () int & Matrix :: operator()(int i, int j) { if (i < 0 || i >= m || j < 0 || j >= n) {puts("\n Значения индексов недопустимы....
Описание слайда:
Перегрузка () int & Matrix :: operator()(int i, int j) { if (i < 0 || i >= m || j < 0 || j >= n) {puts("\n Значения индексов недопустимы. Выход.”);exit(1);} return a[ i ][ j ]; }

Слайд 13


Пример использования void main() { randomize(); Matrix A(3,4),B(3,3,1); // A не инициализируется // случайными числами, // B – инициализируется for (...
Описание слайда:
Пример использования void main() { randomize(); Matrix A(3,4),B(3,3,1); // A не инициализируется // случайными числами, // B – инициализируется for ( int i = 0; i

Слайд 14


Замечание Операция () - единственная, которая может иметь произвольное количество аргументов( в частности 0).
Описание слайда:
Замечание Операция () - единственная, которая может иметь произвольное количество аргументов( в частности 0).

Слайд 15


Пример void Matrix:: operator()() // очистить матрицу { int i, j; for ( i = 0; i
Описание слайда:
Пример void Matrix:: operator()() // очистить матрицу { int i, j; for ( i = 0; i

Слайд 16


Задание: определить деструктор класса Matrix Matrix :: ~Matrix() { int i; for(i = 0; i
Описание слайда:
Задание: определить деструктор класса Matrix Matrix :: ~Matrix() { int i; for(i = 0; i

Слайд 17


4.Перегрузки операций + и += a += b; a = a + b; a – = b; a = a – b; a *= b; a = a * b; a /= b; a = a / b;
Описание слайда:
4.Перегрузки операций + и += a += b; a = a + b; a – = b; a = a – b; a *= b; a = a * b; a /= b; a = a / b;

Слайд 18


4.Перегрузки операций + и += Ранее был рассмотрен пример перегрузки операции +=, меняющей первый операнд, то есть *this. В классе String определим...
Описание слайда:
4.Перегрузки операций + и += Ранее был рассмотрен пример перегрузки операции +=, меняющей первый операнд, то есть *this. В классе String определим операцию +, которая не меняет ни первого операнда, ни второго, как это принято при сложении базовых типов данных. Например, когда мы выполняем операцию a+b, то результат не записывается ни в a, ни в b, если мы не выполним соответствующего присвоения (например, a =a+b, b=a+b, c= a+b).

Слайд 19


Перегрузка + Определение операции + может быть задано таким образом String String :: operator + (const String &s) { String z( len + s.len + 1); //...
Описание слайда:
Перегрузка + Определение операции + может быть задано таким образом String String :: operator + (const String &s) { String z( len + s.len + 1); // определим локальную строку // суммарной длины, пустую strcpy( z.line, line); // перепишем в нее строку // первого операнда strcat(z.line,s.line); // прибавим строку второго // операнда z.len = strlen( z.line ); // определим длину результата return z; // работает конструктор // копирования результата, // затем деструктор разрушает локальный объект z }

Слайд 20


Пример использования void main() { String s1(“Объект ”), s2(“класса “), s3(“ String”); String s4 = s1 + s2 + s3; // работают 2 // операции ‘+’ и...
Описание слайда:
Пример использования void main() { String s1(“Объект ”), s2(“класса “), s3(“ String”); String s4 = s1 + s2 + s3; // работают 2 // операции ‘+’ и конструктор копирования s4.Print(); // вывод “Объект класса String” }

Слайд 21


5. Перегрузка операции ++ Одноместная операция ++ перегружается только в префиксной форме (++i), но может использоваться в постфиксном виде (i++,...
Описание слайда:
5. Перегрузка операции ++ Одноместная операция ++ перегружается только в префиксной форме (++i), но может использоваться в постфиксном виде (i++, компилятор дает об этом предупреждение), работая, однако, префиксно. ++i; и i++; будут действовать одинаково и x = ++i * 5 и x = i++ * 5 тоже одинаково!

Слайд 22


5. Перегрузка операции ++ Например, i = 5; x=i++; // x = 5, i = 6, сначала x = i, затем i++ x=++i; // x = 6, i = 6, сначала ++ i, затем x = i
Описание слайда:
5. Перегрузка операции ++ Например, i = 5; x=i++; // x = 5, i = 6, сначала x = i, затем i++ x=++i; // x = 6, i = 6, сначала ++ i, затем x = i

Слайд 23


Перегрузка ++ в классе String Пример. Операция ++ увеличивает коды символов на 1. String String :: operator ++ () { for(int i = 0; i < len; i++)...
Описание слайда:
Перегрузка ++ в классе String Пример. Операция ++ увеличивает коды символов на 1. String String :: operator ++ () { for(int i = 0; i < len; i++) line[ i ]++; return *this; }

Слайд 24


Использование: void main() { String d(“12345*678”); ++d; d.Print(); // d = ”23456+789” } Аналогично перегружается операция --.
Описание слайда:
Использование: void main() { String d(“12345*678”); ++d; d.Print(); // d = ”23456+789” } Аналогично перегружается операция --.

Слайд 25


6. Перегрузка операции (тип) Операция (тип) используется для преобразования базовых типов данных. Например, если мы хотим узнать код символа char s =...
Описание слайда:
6. Перегрузка операции (тип) Операция (тип) используется для преобразования базовых типов данных. Например, если мы хотим узнать код символа char s = ‘*’, то сделать это можно оператором int k = (int) s; Есть еще такая форма записи операции (тип) тип(выражение). Например, float a = 3.76, b = 0.5, c = 1.22, d = 7; int k = int (a*b - c*d / b);

Слайд 26


Вернемся к классу String Пусть задан такой фрагмент программы String s1, s2(“Солнце!”); char *str = ”Жарко!”; Как отреагирует компилятор на следующие...
Описание слайда:
Вернемся к классу String Пусть задан такой фрагмент программы String s1, s2(“Солнце!”); char *str = ”Жарко!”; Как отреагирует компилятор на следующие присвоения? s1 = str; // char * ->String? допустимо: преобразование из char* в String выполняет конструктор String(char *) и в поле s1.line перепишется строка «Жарко!», поле s1. len =6.

Слайд 27


Итак, преобразование Итак, преобразование конструктор(базовый тип) базовый тип -------->абстрактный выполняет конструктор абстрактного класса с...
Описание слайда:
Итак, преобразование Итак, преобразование конструктор(базовый тип) базовый тип -------->абстрактный выполняет конструктор абстрактного класса с аргументом базового типа (если есть) по умолчанию.

Слайд 28


Рассмотрим присвоение наоборот str = s2; // ошибка: компилятор не знает, какое поле из объекта s2 требуется переписать в строку str. Другими словами,...
Описание слайда:
Рассмотрим присвоение наоборот str = s2; // ошибка: компилятор не знает, какое поле из объекта s2 требуется переписать в строку str. Другими словами, что понимается под преобразованием String -> char* Поэтому, если требуется выполнять это преобразование явно str = (char *)s2; или неявно str = s2;

Слайд 29


Перегрузка операции преобразования Перегрузка операции преобразования имеет общий вид operator тип () {…} В нашем случае, например, её можно...
Описание слайда:
Перегрузка операции преобразования Перегрузка операции преобразования имеет общий вид operator тип () {…} В нашем случае, например, её можно определить следующим образом String :: operator char *() {return line; }

Слайд 30


И присвоение И присвоение str = s2; // неявное String -> char * или str = (char *)s2; // явное преобразование не вызовет ошибочного сообщения...
Описание слайда:
И присвоение И присвоение str = s2; // неявное String -> char * или str = (char *)s2; // явное преобразование не вызовет ошибочного сообщения компилятора, и *str = ”Солнце!”

Слайд 31


Другие определения (char *) String :: operator char*() { String *t = new String ( *this ); return t->line;} или String :: operator char *() { char *t...
Описание слайда:
Другие определения (char *) String :: operator char*() { String *t = new String ( *this ); return t->line;} или String :: operator char *() { char *t = new char [ len+1 ]; strcpy(t, line); return t; }

Слайд 32


А так вообще нельзя! String :: operator char*() { String t ( *this ); // действует конструктор // копирования return t.line;}
Описание слайда:
А так вообще нельзя! String :: operator char*() { String t ( *this ); // действует конструктор // копирования return t.line;}

Слайд 33


String -> int Это преобразование из String в int можно определить таким образом String :: operator int() {return len; } Тогда можно выполнить...
Описание слайда:
String -> int Это преобразование из String в int можно определить таким образом String :: operator int() {return len; } Тогда можно выполнить присвоениe int k = s2; // работает operator int() // k = 7; т.к. String s2(“Солнце!”); и s2.len = 7

Слайд 34


Итак Преобразование operator тип абстрактный тип -------> базовый тип задается специальным оператором (тип).
Описание слайда:
Итак Преобразование operator тип абстрактный тип -------> базовый тип задается специальным оператором (тип).

Слайд 35


Другое преобразование String ->int Определим более полезное преобразование из String в int: преобразование числа-строки в форму целого числа. String...
Описание слайда:
Другое преобразование String ->int Определим более полезное преобразование из String в int: преобразование числа-строки в форму целого числа. String :: operator int() { int k = 0, i; for(i = 0; i

Слайд 36


Пример использования: String d(“12345”); int m; m = d; m = 12345, выполнено преобразование числа-строки во внутреннюю форму целого числа
Описание слайда:
Пример использования: String d(“12345”); int m; m = d; m = 12345, выполнено преобразование числа-строки во внутреннюю форму целого числа

Слайд 37


Преобразование float -> Complex Определим классе Complex class Complex { float re, im; public: Complex( float a, float b) { re = a; im = b;} Complex(...
Описание слайда:
Преобразование float -> Complex Определим классе Complex class Complex { float re, im; public: Complex( float a, float b) { re = a; im = b;} Complex( float d = 0) { re = im = d;} Complex operator +(Complex &); ... };

Слайд 38


float -> Complex Будут справедливы такие действия Complex c1, c2(5, 3); // c1 = 0 +i*0 // c2 = 5 + i*3 float x = 3.3, y; c1 = x; // c1 = 3.3 + i *3.3...
Описание слайда:
float -> Complex Будут справедливы такие действия Complex c1, c2(5, 3); // c1 = 0 +i*0 // c2 = 5 + i*3 float x = 3.3, y; c1 = x; // c1 = 3.3 + i *3.3 Работает конструктор Complex( float ), который определит и мнимую и вещественную части комплексного числа равной x, т.е. с1(3.3 + i*3.3)

Слайд 39


Преобразование Complex -> float Определим классе Complex class Complex { float re, im; public: Complex( float a, float b) { re = a; im = b;} Complex(...
Описание слайда:
Преобразование Complex -> float Определим классе Complex class Complex { float re, im; public: Complex( float a, float b) { re = a; im = b;} Complex( float d = 0) { re = im = d;} Complex operator +(Complex &); ... };

Слайд 40


float -> Complex Будут справедливы такие действия Complex c1, c2(5, 3); // c1 = 0 +i*0 // c2 = 5 + i*3 float x = 3.3, y; c1 = x; // c1 = 3.3 + i *3.3...
Описание слайда:
float -> Complex Будут справедливы такие действия Complex c1, c2(5, 3); // c1 = 0 +i*0 // c2 = 5 + i*3 float x = 3.3, y; c1 = x; // c1 = 3.3 + i *3.3 Работает конструктор Complex( float ), который определит и мнимую и вещественную части комплексного числа равной x, т.е. с1(3.3 + i*3.3)

Слайд 41


Complex -> float Поэтому обратное преобразование Complex -> float надо определить пользователю, например, таким образом Complex :: operator float() {...
Описание слайда:
Complex -> float Поэтому обратное преобразование Complex -> float надо определить пользователю, например, таким образом Complex :: operator float() { return re;} Тогда оператор y = c2; будет верным и y = c2.re = 5, которую вернет operator float ()

Слайд 42


Преобразование абстрактный тип1 ---------> абстрактный тип2 Можно определить и такое преобразование operator (абстрактный тип2) абстрактный тип1...
Описание слайда:
Преобразование абстрактный тип1 ---------> абстрактный тип2 Можно определить и такое преобразование operator (абстрактный тип2) абстрактный тип1 ---------> абстрактный тип2 Например, определим необычное преобразование String -> Complex String :: operator Complex() { Complex z(len); // действует конструктор Complex(float) return z; } Тогда следующий фрагмент кода будет выглядеть совершенно нормально String s(“Маша ела кашу”); Complex c; // c = 0 + i*0 c = s; // c = 13 + i*13

Слайд 43


Задание Определите столь же необычное, но полезное преобразование Complex -> String !
Описание слайда:
Задание Определите столь же необычное, но полезное преобразование Complex -> String !

Слайд 44


Особенности перегрузки операции (тип) Нет аргументов (операция чаще используется неявно) и нет возвращаемого значения (даже void), т.к. тип - это и...
Описание слайда:
Особенности перегрузки операции (тип) Нет аргументов (операция чаще используется неявно) и нет возвращаемого значения (даже void), т.к. тип - это и есть возвращаемое значение; 2. В теле операции обязательно должен быть оператор return со значением, тип которого является типом преобразования.



Похожие презентации
Mypresentation.ru
Загрузить презентацию