Перегрузка функций и перегрузка операций



Повторить теоретические вопросы:

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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!