Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOAP.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
494.59 Кб
Скачать

Перегрузка операции присваивания

Присваивание по умолчанию осуществляется как поэлементное копирование. Перегруженная операция возвращает ссылку на объект, для которого вызывается, и имеет. единственный параметр – ссылку на присваиваемый объект.

  1. Если требуется конструктор копирования, то должна быть перегружена операция присваивания.

  2. Может быть определена только в форме метода класса.

  3. Не наследуется.

const monstr& operator=(const monstr &M)

{

if (&M == this) return *this;

if (name) delete [] name;

if (M.name)

{

name = new char [strlenM.name) + 1];

strcpy(name, M.name);}

else name =0;

health = M.health;

ammo = M.ammo;

skin = M.skin;

return *this;

}

void main()

{

monstr A(10), B, C;

C = B = A;

}

Для перегрузки операции присваивания необходимо

  • убедиться, что нет присваивания вида x = x;

  • удалить предыдущее значение в динамически выделенной памяти;

  • выделить память под новые значения полей;

  • скопировать все значения полей;

  • возвратить значение объекта, на которое указывает this.

Рекомендации по составу классов

  • конструкторы, определяющие как инициализировать объекты;

  • набор методов, реализующих свойства класса (const указывает, что поля класса не должны меняться);

  • набор операций (копирование, присваивание, сравнение, …);

  • класс исключений (сообщения об ошибке)

Если есть функции, работающие с несколькими классами без доступа к скрытым полям, можно описать их вне классов. Для логической связи функции можно поместить в общее пространство имен:

namespace Nashi{

class monstr{…};

class hero{…};

void change(hero, monstr);

}

Самостоятельная работа: разобрать задание из практикума «Реализация класса треугольников»:

Библиотеки

  • cstring – работа со строками в С;

  • iomanip – манипуляторы, то есть функции, которые можно помещать в цепочку помещения и извлечения для форматирования данных (dec, oct, hex, endl, setprecision, setw).

sprintf – вывод в строку (stdio).

Этап 1. Создание многомодульного проекта. Раздел main.cpp. Меню, заглушки. Тестирование, отладка первой версии.

Этап 2. Перемещение точки (перегрузка +), треугольника.

Этап 3. Поиск максимального по площади треугольника: перегрузка >, «не совсем правильная» функция FindMax. Отладка (сбой): конструктор внутри функции, модификация объекта, копирование по умолчанию. Напоминание о работе конструктора и деструктора. Перегрузка операции присваивания, конструктор копирования.

Этап 4. Отношение включения. Алгоритм положения точки относительно вектора (5 вариантов) (самостоятельное изучение).

2. Наследование

Иерархия классов: производные классы получают элементы родительских, или базовых, классов и могут дополнять или изменять их свойства. В начале иерархии – наиболее общие черты для нижележащих классов. Класс может наследовать свойства 2-х и более классов.

Ключи доступа

class имя :[private | protected | public] базовый_класс [[,базовый_класс]]

{тело класса}

class A {…};

class B {…};

class C {…};

class D: A, protected B, public C {…};

По умолчанию для классов ключ доступа private, для структур public.

Обозначим

  • public - 1

  • protected - 2

  • private – 3

Доступ в произ. кл.

Ключ доступа (Y)

1

2

3

Базовый класс (X)

max{X,Y}

1

1

2

3

2

2

2

3

3

-

-

-

Если ключ доступа private можно сделать поля базового класса доступными через доступ к области видимости.

class Base {

public : void f();

};

class D: private Base {

public : Base::void f();

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]