- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
- •Оглавление
- •Предисловие
- •Введение
- •1.1. Понятие класса и объекта. Инкапсуляция
- •1.2. Определение классов. Компоненты. Доступность
- •Class_key /*class_id*/ { /*members_list*/ };
- •Value_type class_id::function_id(parameters) {statements}
- •CPoint point1(100,70); // локальный объект
- •Static cPoint point3(50,120); // статический объект
- •Class_id(parameters) /*:initializer_list*/ {/*statements*/}
- •CString(const char *);
- •Delete[] __thematrix;
- •1.4. Обращение к компонентам объектов
- •1.5. Статические и нестатические компоненты классов
- •1.7. Указатель this
- •В опросы для самопроверки
- •2. Механизм наследования. Полиморфизм
- •2.1. Формы наследования. Базовые и производные классы
- •Class_key class_id: inheritance_specifier base_class_id {member_list};
- •2.3. Абстрактные классы
- •2.4. Множественное наследование и виртуальные классы
- •2.5. Преобразование динамических типов. Динамическая идентификация типов
- •Catch ( std::bad_cast & ) { // обработка исключения
- •Return 0;
- •Вопросы для самопроверки
- •3. Дружественные функции и классы
- •3.1. Дружественные функции
- •3.2. Дружественные классы
- •Вопросы для самопроверки
- •4. Механизм вложения
- •4.1. Вложенные классы
- •4.2. Локальные классы
- •Вопросы для самопроверки
- •5. Объектная модель и шаблоны
- •5.1. Определение, описание и инстанцирование шаблонов
- •::Function_id(function_parameter_list) { statements }
- •5.2. Параметры и аргументы шаблонов
- •Class identifier typename identifier
- •// Key, Data – параметры-типы (типы ключа и данных отображения)
- •// Container – контейнер, где содержится информация отображения class сMap {
- •Class MyTemplate
- •Int array[10]; struct Structure { int m; static int sm; } str;
- •5.3. Шаблоны компонентных функций
- •Value_type function_template_id(function_parameter_list) { statements }
- •::Function_template_id(function_parameter_list) { statements }
- •5.4. Специализация шаблонов
- •Вопросы для самопроверки
- •6. Перегрузка операций
- •Value_type operator @ (parameter_list);
- •Value_type operator @ (parameter_list) { statements }
- •Return fail();
- •6.3. Перегрузка бинарных операций
- •Value_type operator @ (parameter); // компонентная функция
- •Value_type operator @ (parameter, parameter); // глобальная функция friend value_type operator @ (parameter, parameter); // дружественная функция
- •Return *this;
- •Return *this;
- •/* Присваиваем собственные данные класса d */
- •6.4. Перегрузка операций управления памятью
- •Typedef void (*new_handler) ();
- •Extern new_handler set_new_handler( new_handler new_p );
- •Void operator delete(void * memory) {
- •... // Специальная обработка пользователя ::operator delete(memory); // освободить память
- •Вопросы для самопроверки
- •7. Механизм исключений
- •Throw expression
- •7.3. Специальные средства поддержки механизма исключений
- •Unexpected_function set_unexpected(unexpected_function func_name);
- •Typedef void (* unexpected_function) ();
- •Extern char * __throwExceptionName; extern char * __throwFileName; extern unsigned __throwLineNumber;
- •Вопросы для самопроверки
- •8. Подсчет ссылок
- •8.1. Назначение механизма подсчета ссылок
- •8.2. Контекстно-независимая модель счетчика ссылок
- •8.4. Внедрение подсчета ссылок в существующий класс
- •Вопросы для самопроверки
- •9. Стандартная библиотека шаблонов (stl)
- •9.1. Назначение и архитектура stl
- •9.2. Последовательные контейнеры
- •Class vector {
- •// Определение итераторов
- •Sort(first,last); // сортировка вектора в диапазоне итераторов
- •Ifstream ifile ("example.In"); ofstream ofile ("example.Out");
- •OutputIterator copy(
- •InputIterator first, InputIterator last, OutputIterator result );
- •// Заполнение списка
- •Operator- (int)
- •Operator- (random access iterator) operator[] (int)
- •InputIterator find(InputIterator first, InputIterator last, const t & value);
- •InputIterator find(InputIterator first, InputIterator last, const t & value)
- •Return first;
- •OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
- •Return result;
- •OutputIterator transform (InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op)
- •Return result;
- •Void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
- •__Quick_sort_loop(first, last, comp); __final_insertion_sort(first, last, comp);
- •T accumulate(InputIterator first, InputIterator last, t init, Function f);
- •V.Push_back(2); V.Push_back(5);
- •9.5. Функторы
- •T operator()(const t & X) const { return -X; }
- •9.7. Адаптеры
- •S1.Push(1); s1.Push(5);
- •// Записать в вектор числа 1 2 3 4
- •// Сортировать по неубыванию
- •// Записать в вектор числа 4 6 10 3 13 2
- •Вопросы для самопроверки
- •Заключение
- •Библиографический Список
- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
Вопросы для самопроверки
Какие понятия предметной области можно представить шаблонным классом? Сформулируйте общее определение и приведите несколько примеров.
Запишите общий формат определения шаблонного класса.
Какую роль играют параметры шаблонного класса?
Какие компоненты могут входить в шаблонный класс?
Приведите общий формат внешнего определения компонентной функции шаблонного класса.
В шаблонном классе template <class elem_type> class Matrix есть компонентная функция Matrix Sum(const Matrix<elem_type> & m2) const; Постройте заголовок внешнего определения этой функции.
Как правильно определить и инициализировать статический компонент шаблонного класса? Приведите пример.
Почему определение компонент шаблонного класса следует размещать в том же файле, где определен шаблон? Обоснуйте ответ.
Что такое инстанцирование шаблонного класса?
Чем отличается явное инстанцирование от неявного?
Назовите виды параметров и аргументов шаблонных классов и охарактеризуйте назначение каждого из них.
Перечислите основные ограничения, накладываемые на ординарные параметры и аргументы шаблонов.
Приведите пример предварительного объявления шаблонного класса с шаблонным параметром.
Как задаются значения по умолчанию для параметров шаблона разных видов? Приведите примеры.
Заголовок шаблонного класса, представляющего поименованные матрицы, записан следующим образом: template <template <class char_type> class matrix_name, class elem_type = int, size_t default_nrows = 3, size_t default_ncols = 3> class EnhancedMatrix; Возможно ли инстанцирование этого шаблона в виде EnhancedMatrix<>? Обоснуйте ответ.
Каково назначение шаблонов компонентных функций?
Запишите общий формат декларации шаблонов компонентных функций.
Постройте формат внешнего определения шаблонов компонентных функций, принадлежащего обычному классу и шаблонному классу.
Имеется шаблонный класс template <class elem_type> class SpecialMatrix { /* ... */ }, содержащий шаблон копирующего конструктора: template <class elem_type2> SpecialMatrix(const SpecialMatrix<elem_type2> & sample); Как следует записать заголовок этого конструктора во внешнем определении?
Почему в теле шаблона копирующего конструктора невозможно обращение к закрытой и защищенной секциям копируемого объекта? Как устранить эту проблему?
Что понимается под специализацией шаблона?
В чем состоят отличия между полной и частичной специализацией?
Запишите общий формат полной специализации шаблонного класса.
Покажите на примере, как выполняется полная специализация статического компонента шаблонного класса.
Дан заголовок внешнего определения шаблона компонентной функции: template <class elem_type> template <class elem_type2> SpecialMatrix <elem_type> SpecialMatrix <elem_type> :: Mult(const SpecialMatrix <elem_type2> & m2) const (этот шаблон перемножает матрицы с элементами типов elem_type и elem_type2). Выполните частичную специализацию этого шаблона для случая, когда матрица *this имеет вещественные элементы (операторы тела специализации можно не приводить).
Каким образом можно построить производный класс от полной специализации шаблонного класса? Приведите набросок определения.
Запишите общий формат частичной специализации шаблона компонентных функций и приведите пример.
Задачи
Написать шаблонный класс, описывающий конечные множества с произвольным универсумом. Создать проект, в котором этот класс используется.
Разработать шаблонный класс для представления прямоугольных матриц с произвольным типом элемента. Выполнить полную специализацию этого шаблона для элементов типа char (алгоритмы компонентных функций шаблона и специализации предложить самостоятельно). Показать использование шаблонного класса и специализаций в проекте.
Написать шаблонный класс для описания бинарных деревьев с произвольным типом вершин. Выбрать какие-нибудь компоненты класса и выполнить их полную и/или частичную специализацию. Показать использование шаблонного класса и специализаций в проекте.