Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_ООП_1-3иприм.doc
Скачиваний:
6
Добавлен:
15.11.2019
Размер:
248.83 Кб
Скачать

Лабораторная работа № 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( ) – на обычную. Какое сообщение сделает компилятор, почему ?