- •Часть 1:
- •Имена, их области существования и видимости.
- •Объявления и определения.
- •Атрибуты компоновки имен.
- •Использование имен на различных стадиях создания программ.(спросить)
- •Объекты, их типы и классы памяти.
- •Имена типов данных. (спросить)
- •Встроенные и составные типы данных. Квалификатор const.
- •Рекурсивный вызов функций. Тип «указатель на функцию» (спросить). 82
- •Перегрузка функций.
- •Шаблоны функций.
- •Часть 2:
- •Процедурное и объектно-ориентированное программирование.
- •Понятие класса.
- •Работа с this.
- •Конструкторы и деструкторы, их вызов.
- •Уровни доступа. Использование дружественных классов.
- •Перегрузка операций.
- •Абстрактные базовые классы.
- •Шаблоны классов.
- •Часть 3:
- •Множественное наследование.
- •Явные преобразования static_cast, dynamic_cast.
- •Обработка исключительных ситуаций.
Перегрузка функций.
Использование нескольких функций с одним и тем же именем, но с различными типами параметров, называется перегрузкой функций. Компилятор определяет, какую именно функцию требуется вызвать, по типу фактических параметров. Этот процесс называется разрешением перегрузки (перевод английского слова resolution в смысле «уточнение»). Тип возвращаемого функцией значения в разрешении не участвует. Механизм разрешения основан на достаточно сложном наборе правил, смысл которых сводится к тому, чтобы использовать функцию с наиболее подходящими аргументами и выдать сообщение, если такой не найдется.
Правила описания перегруженных функций.
• Перегруженные функции должны находиться в одной области видимости, иначе произойдет сокрытие аналогично одинаковым именам переменных во вложенных блоках.
• Перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В различных вариантах перегруженных функций может быть различное количество
параметров по умолчанию.
• Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или использованием ссылки (например, int и const int или int и int&).
Шаблоны функций.
Многие алгоритмы не зависят от типов данных, с которыми они работают (классический пример — сортировка). Естественно желание параметризовать алгоритм таким образом, чтобы его можно было использовать для различных типов данных.
В C++ есть мощное средство параметризации — шаблоны. С помощью шаблона функции можно определить алгоритм, который будет применяться к данным различных типов, а конкретный тип данных передается функции в виде параметра на этапе компиляции. Компилятор автоматически генерирует правильный код, соответствующий переданному типу. Таким образом, создается функция, которая автоматически перегружает сама себя и при этом не содержит накладных расходов, связанных с параметризацией.
Формат простейшей функции-шаблона:
template <class Туре> заголовок{
/* тело функции */
}
Вместо слова Туре может использоваться произвольное имя.
В общем случае шаблон функции может содержать несколько параметров, каждый из которых может быть не только типом, но и просто переменной, например:
template <class А. class В. int 1> void f(){ ... }
Часть 2:
Процедурное и объектно-ориентированное программирование.
Основными свойствами ООП являются инкапсуляция, наследование и полиморфизм.
Объединение данных с функциями их обработки в сочетании со скрытием ненужной для использования этих данных информации называется инкапсуляцией (encapsulation).
Наследование — это возможность создания иерархии классов, когда потомки наследуют все свойства своих предков, могут их изменять и добавлять новые.
Полиморфизм — возможность использовать в различных классах иерархии одно имя для обозначения сходных по смыслу действий и гибко выбирать требуемое действие во время выполнения программы.
Понятие класса.
Класс является типом данных, определяемым пользователем. В классе задаются свойства и поведение какого-либо предмета или процесса в виде полей данных (аналогично структуре) и функций для работы с ними.
Конкретные величины типа данных «класс» называются экземплярами класса, или объектами. Объекты взаимодействуют между собой, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, содержащий набор необходимых параметров. Механизм сообщений реализуется с помощью вызова соответствующих функций.
При создании каждого объекта выделяется память, достаточная для хранения всех его полей, и автоматически вызывается конструктор, выполняющий их инициализацию. Методы класса не тиражируются. При выходе объекта из области действия он уничтожается, при этом автоматически вызывается деструктор.
Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используются операция . (точка) при обращении к элементу через имя объекта и операция -> при обращении через указатель.
Обратиться таким образом можно только к элементам со спецификатором publiс. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам.
Данные класса называются полями (по аналогии с полями структуры), а функции класса — методами.
Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public.
Поля класса:
□ могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);
□ могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;
□ могут быть описаны с модификатором static, но не как auto, extern и register.
Классы могут быть глобальными (объявленными вне любого блока) и локальными (объявленными внутри блока, например, функции или другого класса).
Ниже перечислены некоторые особенности локального класса:
□ внутри локального класса можно использовать типы, статические (static) и внешние (extern) переменные, внешние функции и элементы перечислений из области, в которой он описан; запрещается использовать автоматические переменные из этой области;
□ локальный класс не может иметь статических элементов;
□ методы этого класса могут быть описаны только внутри класса;
□ если один класс вложен в другой класс, они не имеют каких-либо особых прав доступа к элементам друг друга и могут обращаться к ним только по общим правилам.
Все методы класса имеют непосредственный достул к его скрытым полям, иными словами, тела функций класса входят в область видимости private элементов класса.
Если тело метода определено внутри класса, он является встроенным (inline).