- •А. В. Кибардин
- •Оглавление
- •Введение
- •Классы Описание класса
- •Описание объектов
- •Указательthis
- •Конструкторы
- •Конструктор копирования
- •Конструктор копирования для класса monstr:
- •Статические элементы класса
- •Статические поля
- •Статические методы
- •Дружественные функции и классы Дружественные функции
- •Дружественный класс
- •Деструкторы
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Наследование Ключи доступа
- •Простое наследование
- •Правила наследования методов
- •Виртуальные методы и механизм позднего связывания
- •Абстрактные классы
- •Обработка исключительных ситуаций
- •Синтаксис исключений
- •Перехват исключений
- •Список исключений
- •Иерархии исключений
- •Стандартная библиотека
- •Потоковые классы
- •Стандартные потоки
- •Форматирование данных
- •Флаги и форматирующие методы
- •Манипуляторы
- •Методы обмена с потоком
- •Ошибки потоков
- •Файловые потоки
- •Строковые потоки
- •Конструкторы и присваивание строк
- •Операции
- •Функции Присваивание и добавление частей строк
- •Преобразование строк
- •Поиск подстрок
- •Сравнение частей строк
- •Получение характеристик строк
- •Контейнерные классы
- •Последовательные контейнеры
- •Векторы
- •Двусторонние очереди
- •Ассоциативные контейнеры
- •Словари
- •Словари с дубликатами (multimap)
- •Приложение 1. Шаблоны функций
- •Приложение 2. Шаблоны классов
- •Библиографический список
- •В трех частях
Перегрузка бинарных операций
Бинарная функция-операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода с параметрами, при этом вызвавший ее объект считается первым операндом:
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).
Таблица 1
Связь ключей доступа и спецификаторов доступа
Ключ доступа |
Спецификатор в производном классе |
Доступ в производном классе |
Комментарий |
private |
private protected public |
private private private |
Все элементы private |
protected |
private protected public |
private protected protected |
Все элементы protected, кроме private |
public |
private protected public |
private protected public |
Не изменяется |
Из таблицы видно, что private элементы базового класса недоступны вне зависимости от ключа. Обращение к ним может осуществляться только через методы базового класса.