- •Список литературы по модулю
- •История языка C++
- •Основные особенности C++
- •Простые расширения языка C
- •Объявление переменных ссылочного типа
- •Инициализация и использование ссылок
- •Ссылки в формальных параметрах функций
- •Ссылки как возвращаемые значения функций
- •Константные ссылки
- •Объявление класса
- •Секции в объявлении класса
- •Пример: секции в объявлении класса
- •Объявление полей
- •Определения статических полей
- •Объявление методов
- •Виртуальные и абстрактные методы
- •Объявление конструкторов
- •Пример: объявление конструкторов
- •Создание объектов в динамической памяти
- •Создание массивов в динамической памяти
- •Удаление объектов и массивов
- •Объявление деструктора
- •Пример: объявление деструктора
- •Объекты в автоматической памяти
- •Пример: автоматический вызов деструктора
- •Пример: автоматический вызов деструктора (продолжение)
- •Объекты в глобальной памяти
- •Объекты в полях других объектов
- •Пример: объекты в полях других объектов
- •Проблема копирования объектов
- •Объявление конструктора копий
- •Перегруженная операция присваивания
- •Основной способ наследования в C++
- •Пример: одиночное наследование
- •Переопределение методов
- •Пример: переопределение методов
- •Динамическое приведение типов
- •Пример: динамическое приведение типов не всегда допустимо
- •Пример: динамическое приведение типов
- •private- и protected-наследование
- •Наследование от нескольких базовых классов
- •Иерархия наследования и классы противоречия
- •Неоднозначности в противоречивых иерархиях
- •Разрешение неоднозначностей
- •Основная проблема противоречивых иерархий
- •Виртуальное наследование
- •Пример: виртуальное наследование
- •Понятие шаблона
- •Типовые формальные параметры шаблона
- •Нетиповые формальные параметры шаблона
- •Шаблонные формальные параметры шаблона
- •Значения параметров шаблона по умолчанию
- •Зависимые идентификаторы в шаблоне
- •Инстанциация шаблонов
- •Выведение фактических параметров при инстанциации шаблона функции
- •Требования к фактическим параметрам шаблонов
- •Специализация шаблона функции
- •Пример: специализация шаблона функции
- •Пример: перегрузка имеет больший приоритет, чем специализация
- •Cпециализация шаблона класса
- •Пример: специализация шаблона класса
- •Частичная специализация шаблона класса
- •Вычисления во время компиляции
- •Пример: возведение числа в степень
- •Понятие перегрузки операций
- •Ассортимент перегружаемых операций
- •Перегрузка операции присваивания
- •Операция присваивания возвращает левое значение
- •Составные операции присваивания
- •Перегрузка бинарных арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операций с помощью функций
- •Перегрузка унарных операций
- •Перегрузка операции приведения типа
- •Исключения
- •Оператор throw
- •Пример: оператор throw
- •Синтаксис try- и catch-блоков
- •Пример: перехват исключения std::bad_alloc
- •Жизненный цикл объектов-исключений
- •Пример 1: жизненный цикл объектов-исключений
- •Пример 2: жизненный цикл объектов-исключений
- •Пример 3: жизненный цикл объектов-исключений
- •Пример: уничтожение автоматических объектов в процессе передачи исключения в catch-блок
- •Перехват исключений в инициализаторах конструкторов
- •Пример: перехват исключений в инициализаторах конструкторов
- •Спецификатор throw в заголовках функций
- •Пример 1: спецификатор throw
- •Пример 2: спецификатор throw
- •Спецификатор throw и переопределение виртуальных методов
- •Создание классов исключений
- •Пример: создание классов исключений
Перегруженная операция присваивания
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное
наследование
Обобщённое |
программирова- |
ние |
Перегрузка
операций
Исключения
Проблема копирования объектов возникает также при присваивании. Поэтому, забегая вперёд, покажем на примере класса IntArray, как определить свою операцию присваивания:
class IntArray {
...
IntArray & operator = ( IntArray & obj );
...
};
IntArray & IntArray :: operator = ( IntArray & obj ) { if ( this != & obj ) {
delete [] a; n = obj .n;
a = new int [n ];
memcpy (a , obj .a , n* sizeof ( int ));
}
return * this ;
}
34 / 99
Основной способ наследования в C++
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное наследование
Обобщённое
программирова- ние
Перегрузка
операций
Исключения
Синтаксис одиночного наследование в C++ выглядит как
class ИмяПроизводногоКласса : public ИмяБазовогоКласса
{
...
};
Если конструктор базового класса не имеет параметров (является конструктором по умолчанию), его вызов добавляется компилятором С++ в конструктор производного класса автоматически.
Впротивном случае необходимо явно вызывать конструктор базового класса в конструкторе производного класса.
Вязыке C++ вызов конструктора базового класса X из конструктора производного класса Y выполняется аналогично вызовам конструкторов полей:
Y :: Y( формальные_параметры_конструктора_Y )
:X( фактические_параметры_конструктора_X )
{... }
35 / 99
Пример: одиночное наследование
Базовые |
1 |
class Animal |
|
|
сведения |
2 |
{ |
|
|
Введение |
|
|
||
3 |
private : |
|
|
|
Ссылки |
|
|
||
|
char |
* species ; |
|
|
Классы |
4 |
|
||
|
public : |
|
|
|
Поля и методы |
5 |
|
|
|
|
|
|
|
|
Конструкторы |
6 |
Animal ( char * species ); |
|
|
Создание и |
7 |
}; |
|
|
уничтожение |
8 |
|
|
|
объектов |
|
|
|
|
|
|
|
|
|
Копирование |
9 |
Animal :: Animal ( char * species ): species ( species ) |
{} |
|
объектов |
10 |
|
|
|
Одиночное |
|
|
|
|
|
class Dog : public Animal |
|
||
наследование |
11 |
|
||
Множественное |
12 |
{ |
|
|
наследование |
13 |
private : |
|
|
Обобщённое |
|
|
||
14 |
char |
* breed ; |
|
|
программирова- |
|
|||
|
public : |
|
|
|
ние |
15 |
|
|
|
Перегрузка |
16 |
Dog ( char * bread ); |
|
|
операций |
17 |
}; |
|
|
|
|
|
||
Исключения |
18 |
|
|
|
|
|
|
|
19 |
Dog :: Dog ( char * bread ): |
20 |
Animal (" Canis lupus familiaris "), breed ( breed ) {} |
36 / 99
Переопределение методов
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
ВC++, как и в языке Java, для переопределения метода, унаследованного от базового класса, достаточно объявить и определить этот метод в производном классе.
Вкачестве примера рассмотрим базовый класс Animal:
Конструкторы |
1 |
|
Создание и |
||
2 |
||
уничтожение |
||
объектов |
3 |
|
Копирование |
||
4 |
||
объектов |
||
|
||
Одиночное |
5 |
|
наследование |
6 |
|
Множественное |
||
|
||
наследование |
7 |
|
Обобщённое |
8 |
|
|
||
программирова- |
9 |
|
ние |
||
10 |
||
Перегрузка |
||
11 |
||
операций |
||
Исключения |
12 |
|
|
||
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
class Animal
{
private :
char * species ; public :
Animal ( char * species ); virtual void draw ();
};
Animal :: Animal ( char * species ): species ( species ) { }
void Animal :: draw () { |
|
|
cout << " |
@ @ |
\n" |
" |
(’o ’) |
\n" |
" o( ___ )o |
\n"; |
|
} |
|
37 / 99 |