- •Часть 3. Объектно-ориентированное программирование
- •Екатеринбург
- •Введение
- •Классы Описание класса
- •Описание объектов
- •Указатель this
- •Конструкторы
- •Конструктор копирования
- •Конструктор копирования для класса monstr:
- •Статические элементы класса
- •Статические поля
- •Статические методы
- •Дружественные функции и классы Дружественные функции
- •Дружественный класс
- •Деструкторы
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Наследование Ключи доступа
- •Простое наследование
- •Правила наследования методов
- •Виртуальные методы и механизм позднего связывания
- •Абстрактные классы
- •Обработка исключительных ситуаций
- •Синтаксис исключений
- •Перехват исключений
- •Список исключений
- •Иерархии исключений
- •Библиографический список
- •Оглавление
- •Часть 3. Объектно-ориентированное программирование
- •620002, Екатеринбург, ул.Мира, 19
- •620002, Екатеринбург, ул.Мира, 19
Перегрузка бинарных операций
Бинарная функция-операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода с параметрами, при этом вызвавший ее объект считается первым операндом:
class monstr {
…
bool operator > (const monstr &M) {
if (health >M.get_health ( ) ) return true;
return false;
}
};
Если функция определяется вне класса, она должна иметь два параметра типа класса:
bool operator > (const monstr &M1, const monstr &M2) {
if (M1.get_health ( ) > M2.get_health ( )) return true;
return false;
}
Перегрузка операции присваивания
Операция присваивания определена в любом классе по умолчанию как поэлементное копирование. Эта операция вызывается каждый раз, когда одному существующему объекту присваивается значение другого. Если класс содержит поля, память под которые выделяется динамически, необходимо определить собственную операцию присваивания. Для того чтобы сохранить смысл присваивания, функция-операция должна возвращать ссылку на объект, для которого она вызвана, и принимать в качестве параметра единственный аргумент – ссылку на присваиваемый объект.
class monstr &operator = (const monstr &M) {
//
if (&M= =this) return *this;
if (name) delete [ ] name; //
if (M.name) {
name = new char [strlen(M.name) c+1];
strcpy (name, M.name;}
else name =0;
health = M.health; ammo = M.ammo;
skin = M.skin;
return *this;
}
Возврат из функции указателя на объект делает возможной цепочку операций присваивания:
monstr A(10), B, C;
C = B = A;
Операцию присваивания можно определять только как метод класса. Она не наследуется.
Перегрузка операции приведения типа
Можно определить функции-операции, которые будут осуществлять преобразование объекта класса к другому типу. Формат:
оperator имя_нового_типа ( );
Пример
monstr : : operator int ( ) {return health;}
Наследование Ключи доступа
При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа private, protected и public:
class имя : [private | protected | public] базовый класс
{тело класса};
Если базовых классов несколько, они перечисляются через запятую. Ключ доступа может стоять перед каждым классом, напрмер:
class A {…};
class B {…};
class C {…};
class D: A, protected B, public C {…};
По умолчанию для классов используется ключ доступа private, а для структуры – public (см. таблицу).
Связь ключей доступа и спецификаторов доступа
Ключ доступа |
Спецификатор в производном классе |
Доступ в производном класее |
Комментарий |
1 |
2 |
3 |
4 |
private |
private protected public |
private private private |
Все элементы private |
protected |
private protected public |
private protected protected |
Все элементы protected, кроме private |
Окончание таблицы
1 |
2 |
3 |
4 |
public |
private protected public |
private protected public |
Не изменяется |
Из таблицы видно, что private элементы базового класса недоступны вне зависимости от ключа. Обращение к ним может осуществляться только через методы базового класса.