- •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
CPoint point1(100,70); // локальный объект
CPoint * ppoint2 = new CPoint(200,45); // динамический объект
Static cPoint point3(50,120); // статический объект
Формирование объекта включает два этапа. На первом для объекта выделяется участок памяти, достаточный для размещения всех его данных. Затем, на втором этапе, явно либо косвенно вызывается конструктор класса. Задача конструктора – записать в выделенный участок памяти исходные значения, т.е. определить начальное состояние объекта1. Определяется конструктор подобно другим компонентным функциям, но его имя, как мы уже видели выше, должно совпадать с именем класса. В декларации конструктора не должно указываться возвращаемое значение. Фактически возвращаемое конструктором значение задается неявно как ссылка на созданный объект.
Существует три вида конструкторов: конструктор общего вида, конструктор по умолчанию, конструктор копирования (или копирующий конструктор). Первый конструктор нужен для инициализации состояния объекта по заданным начальным значениям. Формат определения такого конструктора имеет вид
Class_id(parameters) /*:initializer_list*/ {/*statements*/}
В фигурных скобках записаны операторы тела конструктора (тело может быть пустым); initializer_list представляет собой список инициализаторов (если он присутствует, то должен использоваться, например, для инициализации константных компонент объекта); parameters – непустой список деклараций параметров конструктора. Любой класс, благодаря возможностям перегрузки функций, может определить несколько конструкторов общего вида с разными списками параметров, которые могут по-разному инициализировать создаваемый объект.
Конструктор по умолчанию используется тогда, когда при создании объекта его начальное состояние либо не определено, либо не имеет значения, либо может быть получено без внешней информации. В определении такого конструктора список параметров пустой, а значения компонент либо вообще не инициализируются, либо получают некоторые значения по умолчанию. Конструктор по умолчанию относится к тем компонентным функциям, для которых компилятор может автоматически генерировать определение. Генерация происходит в том случае, когда определение или, по крайней мере, описание конструктора по умолчанию не задано явно.
Конструктор копирования предназначен для инициализации одного объекта данными из другого объекта (такой способ формирования объекта принято называть копированием). Соответственно, в декларации параметров такого конструктора фигурирует уже существующий объект (из соображений эффективности и концептуальной строгости это должна быть ссылка на константный объект). Класс может не включать конструктор копирования. В этом случае компилятор автоматически сгенерирует и добавит к определению класса свой конструктор копирования аналогично конструктору по умолчанию.
Несколько вариантов явного вызова конструкторов мы уже видели выше на примере, но среди них не было копирующих конструкторов и конструкторов по умолчанию. Покажем вызовы последних на примере класса CString, который описывает свойства строк символов (предположим, мы решили создать такой класс, поскольку нам «чем-то не нравится» стандартный класс string, имеющийся в библиотеке STL С++).
Вот фрагмент определения класса CString:
class CString {
public:
CString(); // конструктор по умолчанию
CString (const CString &); // конструктор копирования
CString (const char *); // общий конструктор
CString (size_t, char); // еще один общий конструктор – перегрузка
...
};
Ниже даны варианты формирования объектов приведенного класса.
CString S1; // вызов конструктора по умолчанию
CString S2(“строковая константа”); // вызов общего конструктора
CString S3(S2); // вызов конструктора копирования
CString * S4 = new CString(10,’a’); // вызов общего конструктора
CString * S5 = new CString[N]; // вызов конструктора по умолчанию N раз
CString S6 = CString(“еще константа”); // вызов общего конструктора
Важной особенностью общих конструкторов является то, что они иногда могут использоваться не только для явного формирования объектов, но и участвовать в неявном преобразовании типов. Например, конструктор с заголовком