- •Лабораторные работы 1-3 по ооп
- •Справки и пояснения по учебным файлам
- •1. Простейшие опыты
- •2. Исследование дружественных функций. Работа с комплексными числами
- •Лабораторная работа № 2. Перегрузка функций и перегрузка операций
- •2. Комплект файлов point.H, point.Cpp, pointmai.Cpp - класс точка на экране
- •Справки и пояснения по учебным файлам
- •Упражнение 1. Перегрузка функций
- •Упражнения 2. Перегрузка операций
- •1. Данные класса и статус их доступа
- •2. Методы класса Point
Лабораторная работа № 2. Перегрузка функций и перегрузка операций
Повторить теоретические вопросы:
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( ) – на обычную. Какое сообщение сделает компилятор, почему ?