- •Преобразование типов указателей
- •Операторы определения адреса и обращения по адресу
- •Указатели на константы и константные указатели
- •Арифметические действия с указателями
- •Одномерные и многомерные массивы.
- •Строки символов. Основные функции для работы со строками.
- •Перечисление.
- •Структура.
- •Объединения.
- •Битовые поля.
- •Тип данных bool. Тип данных wchar_t.
- •Способы передачи параметров в подпрограммы.
- •Операторы распределения памяти.
- •Объявление typedef.
- •Оператор sizeof.
- •Передача аргументов по умолчанию.
- •Встроенные функции.
- •Определение пространства имён.
- •Оператор разрешения области видимости.
- •Объявление «using». Директива «using». Псевдонимы.
- •Механизм обработки исключений.
- •Вложенные исключения.
- •Определение класса.
- •Указатель this. Спецификаторы доступа к членам класса.
- •«Друзья» класса.
- •Конструктор класса. Список инициализации.
- •Конструктор по умолчанию.
- •Конструктор копирования.
- •Явные конструкторы.
- •Деструкторы.
- •Встроенные функции–члены класса. Статические члены класса.
- •Функции-члены класса с квалификаторами const и volatile.
- •Вложенные классы. Локальные классы.
- •Общие правила перегрузки операторов.
- •Перегрузка оператора присваивания.
- •Оператор индексирования [].
- •Перегрузка бинарных операторов.
- •Составные операторы присваивания.
- •Оператор вызова функции.
- •Операторы преобразования типов (конверторы).
- •Структура данных – стек.
- •Структура данных – очередь.
- •Деревья.
- •Наследование
- •Доступ к членам наследуемого класса
- •Конструкторы, деструкторы и наследование
- •Наследование и присваивание.
- •Виртуальные функции.
- •Полиморфизм и позднее связывание.
- •Передача аргументов по умолчанию в виртуальные функции.
- •Виртуальные деструкторы.
- •Абстрактные классы.
- •Множественное наследование.
- •Виртуальное наследование.
Явные конструкторы.
Конструктор может вызываться явно в 2-х случаях:
в списке инициализаций;
в выражении;
Во втором случае конструктор рассматривается как оператор, возвращающий анонимный константный объект соответствующего типа. Из этого следует, что конструкторы могут использоваться в выражении для явного преобразования типов данных.
Конструктор с одним параметром рассматривается компилятором как определённый пользователем оператор преобразования типов. Т.е. компилятор может использовать этот конструктор для неявного преобразования типов в выражении. Чтобы запретить такое использование конструктора с одним параметром, этот конструктор объявляется как явный при помощи ключевого слова explicit.
Деструкторы.
Деструктор – функция-член класса, имя которой начинается с символа «~», за которым без пробелов следует имя класса. Деструктор предназначен, для освобождения ресурсов, захваченных во время жизни объекта (память). Если ресурсы освобождать не нужно, то деструктор не пишется. В этом случае компилятор генерирует деструктор по умолчанию.
Деструктор должен удовлетворять следующим требования
деструктор всегда может быть только 1;
деструктор не может иметь аргументов;
деструктор не может возвращать значения;
деструктор не может быть объявлен с квалификаторами const или volatile;
деструктор не может быть объявлен со спецификатором static.
Деструкторы вызываются неявно в следующих случаях:
для static-объектов при завершении программы;
для локальных объектов при выходе из блока, в котором эти объекты определены;
при применении оператора delete к указателю на объект.
Пример построения класса в дроби:
Программа, содержащая класс выглядит следующим образом: она содержит 3 файла. 1-м идёт заголовочный файл с расширением h, в котором находится интерфейс класса. Далее имеется файл с расширением cpp, содержащий определение функций класса и дружественных функций. 3-й файл содержит тест на тестирование функций нашего класса, имеет расширение cpp.
Замечание: деструктор не определяем, поскольку данные класса являются простыми переменными.
Встроенные функции–члены класса. Статические члены класса.
Если функция-член класса определена прямо в теле класса, то неявно она считается встроенной. Использование встроенных функций обеспечивает более быстрое их выполнение. Для явного объявления встроенной функции необходимо использовать ключевое слово inline. В этом случае независимо от того, где определяется функция, в теле класса или вне его, система определяет её как встроенную.
Статические члены класса.
Статические элементы класса – такие элементы, которые имеют класс памяти static. Эти элементы являются глобальными объектами, которые принадлежат всему классу и существуют в единственном экземпляре. Статические элементы класса внутри класса только объявляются. А их определение и инициализация осуществляются вне класса.
Функции-члены класса с квалификаторами const и volatile.
Функции-члены класса могут иметь квалификатор const или volatile, или два эти квалификатора вместе. Эти квалификаторы записываются после имени функции и позволяют обеспечить определённый доступ к константным объектам класса и к объектам класса, объявленным со спецификатором доступа volatile. Для константного объекта класса могут быть вызваны только те функции-члены класса, которые объявлены с квалификатором const. Для неконстантного объекта класса могут быть вызваны функции как с квалификатором const, так и без него. Поэтому функции-члены класса, которые не изменяют значения его атрибутов, нужно объявлять с квалификатором const. Запрещено объявлять константную функцию-член класса, которая модифицирует члены класса прямо или косвенно через неконстантные функции-члены класса. Константную функцию-член класса можно перегружать неконстантной функцией с тем же списком параметров.
Пример:
Class Counter
{ int n; //счётчик
public
counter (): n (0) {};
int count () const {return n;}
int count () {return ++n;}
};
int main ()
{counter m;
const counter k;
cout<<m.count ()<<endl; //1
cout<<k.count ()<<endl; //0
return 0;
}
Для объекта класса, объявленного со спецификатором доступа volatile могут быть вызваны только те функции-члены класса, которые также объявлены со спецификатором доступа volatile. Для объекта класса, объявленного без квалификатора доступа volatile, могут быть вызваны функции как с квалификатором volatile, так и без него. Функцию класса с квалификатором volatile можно перегружать функцией класса с тем же списком параметров, но без этого квалификатора.
Чтобы разрешить модификацию члена класса, принадлежащего константному объекту, этот элемент класса должен быть объявлен с квалификатором mutable.
Пример:
Class Counter
{ mutable int n; //счётчик
public
counter (): n (0) {};
int count () const {return ++n;}
};
int main ()
{const counter k;
cout<<k.count ()<<endl; //1
return 0;
}