
- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •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 Шаблоны классов
cout<<”максимум =”<<max(l,i);}
В С++ нет механизма изменения типа возвращаемого значения. Для того чтобы функции возвращали результат без потери значения, при вызове функции, переменную или константу старшего типа необходимо использовать в качестве 1го аргумента.
Обращение типа max(i,l), max(i,d) даст неверный результат. Возвращаемое значение не поместится в переменную типа int.
Шаблоны функций экономят много времени, так как шаблон мы пишем только один раз, а использовать можем с разными типами данных. Шаблоны функций намного упрощают дальнейшую поддержку кода, и они более безопасные, так как нет необходимости выполнять вручную перегрузку функции, копируя код и изменяя лишь типы данных, когда нужна поддержка нового типа данных.
У шаблонов функций есть несколько недостатков:
·Во-первых, некоторые старые компиляторы могут не поддерживать шаблоны функций или поддерживать, но с ограничениями. Однако сейчас это уже не такая проблема, как раньше.
·Во-вторых, шаблоны функций часто выдают непонятные сообщения об ошибках, которые намного сложнее расшифровать, чем ошибки обычных функций.
·В-третьих, шаблоны функций могут увеличить время компиляции и размер кода, так как один шаблон может быть «реализован» и перекомпилирован в нескольких файлах.
7.10 Шаблоны классов
Шаблоны классов позволяют построить отдельные классы аналогично шаблонам функций. Имя шаблона класса должно быть уникальным и не может относиться к какомулибо шаблону класса, функции или объекта.
Пример: class vector не зависит от типа данных, производится инициализация получения элемента по индексу.
#include <iostream>
#include<string.h>
using namespace std;
template <class T>
class vector
{ T *data;
int size;
public:
vector(int);
~vector() {delete[] data;} T& operator[](int i) {return data[i];}};
template <class T> vector <T> :: vector(int n)
{data=new T[n]; size=n;}
int main()
{vector <int> x(10); for (int i=0;i<10;++i)
{x[i]=i*i;
cout<<x[i];} vector <char> c(5);
for (char ic=0; ic<5; ++ic) {c[ic]=ic+'a'; cout<<c[ic];}
}
Также как для шаблонов функций для определённого типа данных возможно запретить автоматическую генерацию классов по шаблону.
class vector<char *>{…};
Для вектора строк класс по шаблону генерироваться не будет.