- •1. Основные типы данных, объявление пользовательских типов данных typedef
- •Int (целочисленный тип)
- •2. Основные директивы препроцессора. Макросы
- •3. Указатели и динамическая память
- •4. Понятие функций. Механизм вызова функций и передача параметров
- •5. Передача и возврат параметров по значению и по указателю
- •6. Ссылки и ссылочные параметры
- •7. Перегрузка функций
- •8. Использование спецификатора const с указателями.
- •9. Понятие идентификатора. Пространства имен. Ключевое слово namespace
- •10. Анонимные пространства имен. Ключевое слово using.
- •11. Понятие структур. Оператор доступа к полям структуры по указателю.
- •12 . Понятие класса и объекта.
- •13. Время жизни переменных и объектов.
- •14. Область действия класса. Управление доступом к членам класса. Отделение интерфейса от реализации
- •15 . Понятие конструктора. Использование конструктора с аргументами по умолчанию. Конструктор по умолчанию.
- •16. Понятие деструктора. Когда вызываются конструкторы и деструкторы.
- •17. Константные объекты и функции-члены.
- •18. Дружественные функции и дружественные классы.
- •19. Использование указателя this.
- •20. Использование операции new и delete.
- •21. Статические члены класса.
- •25.Функции-операции как члены класса и как дружественные функции.
- •26.Перегрузка операции присваивания. Условия вызова оператора присваивания и конструктора копирования.
- •27. Понятие наследования. Механизм ограничения доступа при наследовании.
- •28.Приведение типа указателя базового класса к указателю производного класса и наоборот.
- •29.Переопределение членов базового класса в производном классе.
- •30. Конструкторы и деструкторы в производных классах
- •32. Неявный вызов конструкторов объектов
- •33. Понятие виртуальной функции
- •34. Понятие полиморфизма (примеры)
- •35. Абстрактные и конкретные базовые классы
- •36. Статическое и динамическое связывание
- •37. Виртуальные деструкторы
- •38. Шаблоны. Шаблонная функция
- •39. Шаблоны классов. Применение. Параметры шаблона типа typename
- •40. Шаблоны классов и наследование.
- •41. Шаблоны. Инстанцирование шаблонов и спецификация шаблонов
- •42. Понятие исключения. Когда должна использоваться обработка исключений.
- •43. Генерация исключений. Повторная генерация исключений
- •44. Перехватывание исключений
- •45. Спецификация исключений. Обработка неожидаемых исключений.
- •46. «Раскручивание» стека. Иерархия исключений стандартной библиотеки
- •47. Конструкторы, деструкторы и обработка исключений. Исключения и наследование.
- •48. Обработка неуспешного выполнения new
- •49. Стандартная библиотека шаблонов (stl). Основные типы контейнеров
- •50. Стандартная библиотека шаблонов (stl). Алгоритмы, методы, итераторы
- •51. Последовательные контейнеры: vector, list, deque. Основные методы и алгоритмы
- •52. Ассоциативные контейнеры: set, multiset, map, multimap. Основные методы и алгоритмы.
- •53. Операторы приведения типов static_cast, reinterpret_cast
- •54. Информация о типе времени выполнения (rtti). Использование функции typeid(). Оператор dynamic cast
- •55. Ключевое слово ехрlicit.Ключевое слово mutable
- •56. Классы-контейнеры и классы-итераторы
- •57. Понятие ооп. Парадигмы ооп (инкапсуляция, наследование, полиморфизм)
- •58. Основные составляющие объектного подхода: абстрагирование, инкапсуляция, модульность
- •59. Природа объекта. Состояние, поведение, идентичность объекта
- •60. Отношения между объектами. Связи. Агрегация
55. Ключевое слово ехрlicit.Ключевое слово mutable
Explicit
Explicit -это ключевое слово используется для запрещения создания конвертирующего конструктора. пример:
class String {
public:
String (int n);//выделить n байт для создания объекта
String(const char *p); // инициализировать объект из C-строки
}
При этом если выполнить следующий код:
String s = 'x';
то 'x' преобразуется в int и будет вызван конструктор String(int). Это совсем не то поведение, которое можно было бы ожидать. Для избежания таких ситуаций и используется ключевое слово explicit:
class String {
public:
explicit String (int n);//выделить n байт для создания объекта
String(const char *p); // инициализировать объект из C-строки
}
class String {
public:
explicit String (int n);//выделить n байт для создания объекта
String(const char *p); // инициализировать объект из C-строки
}
Таким образом, объявление конструктора с одним аргументом (или с несколькими аргументами, где все, кроме первого имеют значения по умолчанию) explicit гарантирует неиспользование его в качестве оператора приведения типа.
Mutable
Константная функция-элемент “обещает” не изменять значений элементов данных класса, что позволяет применять ее на константных объектах. Тем не менее, в некоторых ситуациях имеет смысл разрешить некоторым элементам меняться даже у константных объектов. Например, некоторый существенный набор данных изменять ни в коем случае нельзя, в то время как отдельный элемент, скажем, некоторое сообщение, может и должно меняться. В этом случае можно объявить элемент данных с ключевым словом mutable:
class AnyClass {
int value;
mutable const char *msg;
public.:
AnyClass (): value (0), msg(NULL) {}
int GetValueO const;
// ... };
int AnyClass::Get Value() const
{
msg - "New message!";
// Допускается, поскольку msg - mutable.
// value изменять нельзя:
// value = 111;
return value;
}
Модификатор mutable не может применяться совместно с const или static (в приведенном примере все верно, поскольку const относится не к msg, а к содержимому строки, на которую он ссылается).
56. Классы-контейнеры и классы-итераторы
К наиболее популярным типам классов относятся классы, контейнеры (называемые также классы совокупностей), т.е. классы, спроектированные для хранения в них совокупностей объектов. Классы контейнеры обычно снабжены такими возможностями, как вставка, удаление, поиск, сортировка, проверка наличия элемента в классе и тому подобное. Массивы, стеки, очереди, связные списки — все это примеры классов контейнеров.
Принято ассоциировать объекты итераторы, или, короче — итераторы, с классами контейнерами. Итератор — это объект, который возвращает следующий элемент совокупности (или определяет некоторое действие над следующим элементом совокупности). Когда написан итератор класса, легко получить следующий элемент этого класса. Итераторы обычно пишутся как друзья классов, с которыми они работают. Это предоставляет итераторам возможность прямого доступа к закрытым данным этих классов. Подобно тому, как книга, читаемая несколькими людьми, могла бы иметь в себе сразу несколько закладок, класс контейнер может иметь несколько одновременно работающих итераторов. Каждый итератор поддерживает свою собственную «позицию» информации.
Пример:
#include <iterator>
// type - имя типа элементов с которыми будет работать итератор
class MyIterator:
public std::iterator
<std::forward_iterator_tag, type> {
...
};