
- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •1.1 Свойства ООП
- •Понятие класса в С++
- •1.2 Понятие класса С++
- •Создание класса
- •1.3 Создание класса
- •Члены класса
- •1.4 Члены класса
- •Инкапсуляция
- •1.5. Инкапсуляция
- •1.6 Функции-члены класса
- •Реализация понятия «дата» при помощи структуры
- •1.7 Реализация понятия «дата» при помощи структуры
- •Реализация понятия «дата» при помощи класса
- •1.8 Реализация понятия «дата» при помощи класса
- •Определение и вызов функций–членов класса
- •Выводы. Примеры
- •1.9 Выводы
- •1.10 Пример создания класса
- •Конструкторы
- •2.1 Конструкторы
- •2.2 Пример класса без конструктора
- •2.3 Пример класса с конструктором
- •2.4. Конструктор с параметрами по умолчанию
- •2.5. Деструкторы
- •2.6. Пример класса с конструктором и деструктором
- •2.7. Подставляемые или inline функции.
- •2.8. Подставляемые функции-члены.
- •2.9. Указатель this
- •2.10. Использование указателя this
- •Дружественные функции
- •3.1 Дружественные функции
- •3.2 Пример дружественной функции
- •3.3 Дружественные классы
- •3.4. Уточнение имени элемента.
- •3.5. Определение переменных непосредственно перед использованием
- •3.6. Статические элементы класса.
- •2.7. Пример
- •Перегруженные функции
- •4. Перегрузка функций и операций
- •4.1 Полиморфизм
- •4.2 Перегруженные функции
- •4.3 Перегрузка конструктора
- •4.4 Выбор экземпляра функции
- •4.5 Перегрузка стандартных операций
- •4.6 Перегрузка операций сложения и присваивания
- •4.7 Перегрузка операций ++ и --
- •4.8 Дружественные функции-операции
- •4.9 Перегрузка операции индексации []
- •4.10 Аргументы по умолчанию
- •5. Работа с объектами
- •5.1 Ссылки в С++
- •5.2 Передача объектов, как аргументов функции
- •5.3 Массивы объектов
- •5.4 Указатель на объект
- •5.5 Динамическое выделение памяти. Операторы new, delete.
- •5.6 Локальные классы
- •5.7 Вложенные классы
- •5.8 Имена заголовочных файлов в С++
- •5.9 Строковые переменные в С++.
- •6. Наследование
- •6.1 Понятие наследования
- •6.2 Базовые и производные классы
- •6.3 Одиночное и множественное наследование
- •6.4 Управление доступом производных классов
- •6.5 Пример
- •6.6 Конструкторы с параметрами при наследовании
- •6.7 Конструкторы при множественном наследовании
- •7. Виртуальные функции. абстрактные классы
- •7.1 Указатели на производные типы
- •7.2 Виртуальные функции
- •7.3 Пример
- •7.4 Чистые виртуальные функции и абстрактные типы
- •7.5 Виртуальные базовые классы
- •7.6 Шаблоны
- •7.7 Шаблоны функций
- •7.8 Пример
- •7.9 Использование шаблонов с двумя типами параметров
- •7.10 Шаблоны классов

triangle t; rectangle s; circle c; p=&t;
p->set_dim(3,4); p->show_area(); p=&s;
p->set_dim(5,6); p->show_area(); p=&c;
p->set_dim(8); p->show_area();
}
7.5 Виртуальные базовые классы
При наследовании класса при создании объекта производного типа выполняются последовательно конструкторы всех классов прародителей, начиная с самого базового.
Деструктор в производном классе должен выполняться прежде выполнения деструктора в базовом классе. При множественном наследовании, когда базовые классы перечисляются через запятую, при создании объекта, конструкторы выполняются в порядке следования базовых классов слева направо.
При множественном наследовании базовый класс не может быть задан в производном классе более одного раза, но базовый класс может быть передан производному классу более одного раза косвенно.
class X : public Base{…};
class Y : public Base{…};
class D : public X, public Y{…};
Чтобы избежать неоднозначности при обращении к члену базового объекта можно объявить базовый класс виртуально.
class X : virtual public Base{…};
class Y : virtual public Base{…};

class D : virtual public X, public Y{…};
Класс D имеет один подобъект класса Base.
7.6 Шаблоны
Шаблоны – это одна из реализаций полиморфизма в С++.
Механизм шаблонов в языке С++ позволяет решать проблему унификации алгоритма для различных типов: нет необходимости писать различные функции для целочисленных, действительных или пользовательских типов – достаточно составить обобщенный алгоритм, не зависящий от типа данных, основывающийся только на общих свойствах. Например, алгоритм сортировки может работать как с целыми числами, так и с объектами типа «автомобиль».
Шаблон представляет собой специальное описание родовой (параметризированной) функции или родового класса, в которой информация об используемых в реализации типов данных преднамеренно остаётся незаданной.
По описанию шаблон функции похож на обычную функцию: разница в том, что некоторые элементы не определены (типы, константы) и являются параметризованными.
Типы используемых данных передаются через параметры шаблона. Аппарат шаблона позволяет одну и ту же функцию или класс использовать с различными типами данных без необходимости программировать заново каждую версию функции или класса.
Шаблон создаётся при помощи ключевого слова template и угловых скобок <> со списком параметров, за которым следует описание класса или функции.
template <class фикт_имя1, class фикт_имя2 …>
Вместо ключевого слова class допускается использование ключевого слова typename. Шаблоны тождественны интеллектуальным макросам, которые способны сообщить компилятору о каждом случае использования шаблона новых типов данных.
7.7 Шаблоны функций
Пример: определить максимальное значение из двух аргументов max(x,y).
Способы реализации:
1.В случае целых и вещественных чисел придется написать 2 функции.
2.макрос
#define max(x,y) (((x)>(y)?(x): (y))
Преимущество — можно сравнивать данные различных типов
Недостаток — позволяет сравнивать несовместимые типы данных, т.е отсутствует механизм контроля типов данных.
3. Используя вместо макроса шаблон, можно определить заготовку для семейства связанных перегруженных функций или классов, при этом тип данных передавать как параметр.
template <class T>
T max(Tx,Ty)
{return (x>y) ? x : y;};
Здесь тип данных представляется аргументом класса T.
Т – фиктивное имя типа данных, которое программист выбирает по своему усмотрению.
Компилятор сгенерирует соответствующий код функции max() согласно действительному типу данных, используемому при вызове функции.
7.8 Пример
Пример:
#include<string.h>
#include<iostream.h> template<class T>
T max(Tx,Ty) {return(x>y)?x:y;}; int main()
{int a=5, b=30, c=15, d=0; float pi=3.14, e=2.172;
cout<<”наиб.2х целых”<<max(d,a);
d=max(a,max(b,c));
cout<<”наиб.3х целых”<<d;
cout<<”max(pi,e)=”<<max(pi,e); char m[]=”мама”,p[]=”папа”,*s; s=max(p,m);
cout<<”кто в доме хозяин?”<<s;
}
Для приведённой программы компилятор автоматически сгенерирует по шаблону три перегруженных функции с типами:
int max(int x,int y);
float max(float x,float y);
char * max(char *x, char *y);
Экземпляр функции создаётся каждый раз при вызове функции с аргументами, для которых определение не найдено. Если имеется точное определение обычной функции, то в её вызов вставляется тело программы. Особенности возникают, когда в качестве параметров передаются строки. Функция сравнивает два указателя, а не содержимое строк в кодировке ASCII “папа”>”мама”. В действительности результат зависит от того, в какой последовательности компилятор размещает в памяти указанные строки.
Чтобы не производить бессмысленного сравнения двух указателей для строк, можно перегрузить функцию max следующим образом:
char *max(char *x, char *y)
{return (strcmp(x,y)>0?x:y;}
В этом случае компилятор не будет производить генерацию функции по шаблону, а воспользуется готовой. Для шаблонов функций преобразование аргументов по умолчанию не выполняется. Функция должна использовать все аргументы шаблона, в противном случае компилятор не может определить фактические типы данных для генерации тела функции.
7.9 Использование шаблонов с двумя типами параметров
Если подставляемые параметры окажутся разных типов, то компилятор не сможет создать реализацию шаблона. В этом случае в шаблоне указывется несколько фиктивных имен типов параметров.
#include <iostream>
template <class T1, class T2>
T1 max(T1 x, T2 y)
{if (x>=y) return x;
return y;}
main()
{int i=5; long l=123456;
float d=5.5;
cout<<”максимум =”<<max(d,i);