- •Ооп. Абстракция, полиморфизм, наследование, инкапсуляция
- •Методы класса: классификация методов, доступ к членам класса, неявный параметр this. Определение и реализация методов. Использование методов для экземпляров класса.
- •Перегрузка функций: правила перегрузки, выбор функции. Использование перегруженных функций.
- •Перегрузка операторов: правила перегрузки, перегрузка бинарных и унарных операторов. Использование перегруженных операторов. Понятие объектов функций (функторов).
- •Перегрузка унарных операторов
- •Бинарные операторы
- •Преобразования типа: назначение, использование. Правила преобразования типа. Возможные проблемы.
- •Оператор присваивания
- •Типы отношений между классами. Контейнерные классы: определение, видимость членов класса. Реализация и вызов конструкторов и деструкторов вложенных классов. Реализация и использование методов.
- •Вложенные классы
- •12. Понятие и назначение итераторов. Проектирование, реализация и использование итератора (на примере динамического списка).
12. Понятие и назначение итераторов. Проектирование, реализация и использование итератора (на примере динамического списка).
Иетратор – это обобщение концепции указателей: они ссылаются на элементы контейнера. Их можно инкрементировать, как обычные указатели, и они будут ссылаться последовательно на все элементы контейнера(можно представить в виде кабеля, связывающего элементы)
class SmartPointer { //Привожу пример тупого итератора
private:
float* p; // обычный указатель
public:
float operator*() {}
float operator++() {}
};
void main() {
….
SmartPointer sptr = start_addres;
for(int j=0; j<SIZE; j++)
cout<< *sptr++;
}
Множественное наследование: определение, реализация, использование экземпляров производного и базовых классов. Возможные неоднозначности, их устранение. Виртуальные классы, их назначение. Определение и реализация производных классов, использующих виртуальные базовые классы. Вызов конструкторов виртуального класса.
class A { //делаем виртуальный класс
friend class B;
A(); // конструктор доступен только внутри класса и его друга B public:
int data;
virtual void show() = 0; //виртуальная функция
};
class B:virtual public A {
public:
B() { … } //Конструктор доступен всем
void show() {
cout << data << endl;
};
};
class C:virtual public A {
public:
void show() {
cout << data << endl;
};
};
class D:public B, public C {
public:
D() {} //Тут ошибка, т.к. конструктор A не доступен данному классу…
void show() {--||--};
int getdata() {
return data}; //Правильно получаем данные, которые, как бы, одинаковы в родительских классах
};
Шаблоны: назначение и типы шаблонов. Шаблоны функций: определение, реализация. Использование функций шаблона. Параметризованные классы: определение и реализация. Использование экземпляров класса шаблона. Использование механизма наследования в шаблонах классов. Стандартная библиотека шаблонов STL: общая характеристика, состав, основные компоненты. Использование итераторов в классах STL. Пример использования класса Vector.
Шаблоны позволяют использовать одни и те же функции или классы для обработки данных разных типов.
template<class T> // Шаблон функции
T abs(T n)
{return (n<0) ? –n : n; } //вычисление модуля
Int main() {
int int1 = -6;
double dub1 = 9.95;
int1 = abs(int1); //int1 = 6
dub1 = abs(dub1); //dub = 9.95
};
В С++ параметризованный класс создается с помощью ключевого слова template.
template <class Type > classname { . . . } ;
Параметр Туре представляет любой тип, передаваемый шаблону. Это может быть встроенный С++-тип или определенный пользователем класс.
STL содержит несколько основных сущностей. Три наиболее важные из них - это контейнеры, алгоритмы и итераторы.
Контейнер – это способ организации хранения данных.
Алгоритм – процедура, применяемая к контейнеру для обработки данных.
Итератор – это обобщение концепции указателей: они ссылаются на элементы контейнера.
STL делится на две категории: последовательные(стек, векторы, списки…) и ассоциативные(множества, мультимножества…)
Вектор – это, так сказать, умные массивы. Они занимаются автоматическим размещением себя в памяти, расширением и сужением своего размера по мере вставки или удаления данных. Векторы можно использовать, в каком-то смысле, как массивы, обращаясь к элементам через [].
#include<vector>
……..
int main() {
vector<int> v; //создать вектор
v.push_back(10); //внести данные в конец вектора
v.push_back(11);
v.push_back(12);
v.push_back(13);
v[0]=20; //заменяем новыми значениями
v[3]=23;
for(int i=0; i<v.size(); i++) //выводим содержимое
cout << v[j] << ‘ ‘; //20 11 12 23
cout << endl;
return 0;
}
Файловый потоковый ввод-вывод: иерархия и назначение классов. Основные методы для организации потокового ввода-вывода. Определение состояния потока. Организация работы с файлами: классы, основные методы. Реализация произвольного доступа к файлам.