Перегрузка функций и перегрузка операций
Повторить теоретические вопросы:
1. Перегрузка функций и перегрузка операций, функциия-операция operator Ä(аргументы).
2. Дружественные функции и классы, статус их доступа к данным и к методам класса..
Ознакомиться и провести эксперименты с комплектами учебных файлов:
1. комплект файлов stroka.cpp и stroki.cpp - класс “строка символов”
2. комплект файлов point.h, point.cpp, pointmai.cpp - класс точка на экране
3. Файлы conkat.cpp и stroka.cpp с перегруженной операцией + (конкатенация строк). См. так-же:
а) Файлы OVRLOAD1.cpp и OVRLOAD1.H - перегрузка + дружественной операцией-функциейf(arg1, arg2).
б) Файлы OVRLOAD2.cpp и OVRLOAD2.H - перегрузка + f(arg2)в теле класса.
4. Файл friend2.cpp - класс char_loc - символ в позиции экрана.
5. Файлы CMPLX.CPP и CMPLX.H с дружественными операциями-функциями (+ - * / ) для комплексных чисел.
Справки и пояснения по учебным файлам
После перегрузки операции + в Си-программе появляется возможность склеивания строк как в Бейсике.
Обратите внимание, что операция + перегружена для данных типа (класса) stroka и не поддерживает склейку символьных массивов, хотя это вроде бы тоже строки.
Так же обратите внимание (и испытайте), что к перегруженной операции-функции можно обращаться как к обычной функции с именем “operator +”и указанием аргументов в скобках (аргументы)по шаблону :
Новая строка = operator +(строка1, строка2); - если перегружена вне класса, и
Новая строка = Обект_строка1.operator +(строка2); - если перегружена в теле класса.
|
|
Поскольку класс stroka содержит динамический массив то при копировании и присваивании объектов строк, могут возникать проблемы с освобождением памяти. После завершения программы, компилятор делает сообщение "Null pointer assigment" - назначен нулевой указатель, т.е. - не освобождена память. Причина в том, что конструктор копии и операция присваивания, создаваемые компилятором некачественные, они слепо копируют адреса внутренних динамических массивов и поэтому деструктор не может освободить динамическую память. Для обеспечения качественного копирования рекомендуется самим перегрузить операцию присваивания и конструктор копии. (Добавьте эту перегрузку в тело класса, т.к. компилятор не позволяет осуществлять её вне класса.)
stroka& operator=(stroka& s2){
if (this==&s2) return *this; //проверка присваивания самому себе
len=s2.len; //выделим новую память
ch=new char[len+1]; strcpy(ch,s2.ch);
return *this;
}//--------------------------------------------------
Испытайте операцию присваивания строк на предмет корректного освобождения памяти и добавьте конструктор копии
Stroke(stroka& s){
int len=strlen(s);
ch=new char[len+1]; //выделим новую память
|
|
strcpy(ch,s);
}//--------------------------------------------------
И снова испытать.
В файле friend2.cpp приведен простой класс char_loc) – символ в позиции экрана и дружественная функция, put_ch( ), которой разрешен доступ к данным этого класса.
Проделать опыт: заменить дружественную функцию put_ch( ) – на обычную. Какое сообщение сделает компилятор, почему ?
Упражнение 1. Перегрузка функций
1.1. Перегрузить функцию swap(a, b) - обменник, т.е. объявить в программе две одноименные функции для разных типов данных из табл.1. Вариант Вар = № MOD 14 +1.
Таблица 1.
№ | тип a,b 1й функции | тип a,b 2й функции | № | тип a,b 1й функции | тип a,b 2й функции |
1 | int | stroka | 8 | double | float **z, масс. n*n |
2 | int | float | 9 | point | float **z, масс. n*n |
3 | stroka | char *s | 10 | point | float *x, массив n эл |
4 | double | cmplx | 11 | point | stroka |
5 | cmplx | stroka | 12 | point | cmplx |
6 | double | float *x, массив n эл | 13 | point | double |
7 | stroka | float **z, масс. n*n | 14 | stroka | complex из <complex.h> |
Подключить необходимые заголовочные учебные файлы с определением классов.
1.2. Перегрузить функцию cmplx sqrt(cmplx); для класса cmplx комплексных чисел, из файла CMPLX.H и решить квадратное уравнение z= A*X2 + B*x + Cс комплексными переменными по формулам Виетта. Числа A, B и C взять из предыдущей работы. Квадратный корень из комплексного числа X равен
|
|
, где - модуль, - аргумент комплексного числа X.
Для контрольного примера используем теорему Виета, согласно (X-X1)(X-X2) = 0, при известных корнях X1 и X2 коэффициенты нашего уравнения равны A = 1, B=-(X1+X2), C = X1*X2. Вычислим эти коэффициенты и найдем новые корни нашего уравнения x1 и x2, которые, если наша функция cmplx sqrt(cmplx)правильная,совпадут с исходными X1 и X2.
Отчет по 3й части должен содержать: -тексты программ, - ручные проверки и выводы.
Дата добавления: 2018-04-15; просмотров: 310; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!