
- •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
1.1. Понятие класса и объекта. Инкапсуляция
Основа объектной модели в языке С++ – понятие класса. Класс описывает реальное или абстрактное понятие, являясь его программной моделью. Он включает описание набора атрибутов и действий, свойственных целому множеству объектов или явлений. В С++ класс обладает правами типа данных подобно структуре, т.е. от него можно определять переменные и константы, его можно использовать в списке параметров функций и т.п. Но класс – это нечто гораздо большее, чем просто структура. Структура – лишь «пассивная» коллекция данных. Класс, в отличие от нее, обладает определенной «функциональностью».
Переменные (константы), получаемые от класса, принято называть объектами. Объект способен к проявлению своего поведения через ту функциональность, которая заложена в его классе. При этом объект характеризуется состоянием, которое определяется значениями заключенных в нем данных (компонент). Таким образом, он является самодостаточной частью программы, способной к имитации поведения некоторой части реального мира или абстракции. Подобное представление класса принято называть инкапсуляцией. Инкапсуляция, являющаяся важнейшим принципом объектного подхода к построению программ, означает способность класса к сокрытию деталей реализации внутри него самого, делает объекты этого класса самодостаточными сущностями, взаимодействующими друг с другом и с другими объектами через четко определенные интерфейсы. Интерфейс класса – это набор тех компонент, которые могут использоваться для взаимодействия с объектами этого класса. Иными словами, это перечень возможностей, предлагаемых классом внешнему миру.
1.2. Определение классов. Компоненты. Доступность
В С++ класс строится как расширение структурного типа (структуры или объединения). Как и структура, класс может включать разнотипные данные, в том числе структуры и классы. В отличие от структур, класс также содержит и функции, которых по определению не может быть в структуре.
В самом общем виде класс, не являющийся производным от другого класса (других классов), определяется следующим образом:
Class_key /*class_id*/ { /*members_list*/ };
Элементы определения class_key и class_id образуют заголовок определения класса, а members_list – список компонент (членов) класса (в комментариях здесь и далее мы будем показывать необязательные части определений). class_key – это ключ категории класса; class_id – произвольный корректно построенный идентификатор.
Элемент class_key задает доступность и размещение компонент объектов определяемого класса в памяти, а также возможность использования класса при наследовании. Его возможные значения: class, struct, union. Если класс определить с ключом class, все его компоненты будут недоступны (закрыты) для использования извне. Если взять ключ struct, все компоненты будут доступны (открыты). Действие ключа union аналогично struct, однако он меняет способ размещения компонент объектов класса в памяти.
Основными компонентами класса являются (компонентные) данные и функции. Первые отображают свойства объектов этого класса, а вторые – их поведение. Кроме данных и функций, в определение класса могут входить типы, перечисления, структуры, объединения, битовые поля, классы, шаблоны классов, шаблоны функций. Данные включаются в класс в форме деклараций. При необходимости в них используются квалификаторы, например, const или volatile. Функции можно включить в тело класса как в форме декларации (вводится только прототип), так и в форме определения (вводится и заголовок, и тело функции). При этом если в класс включен только прототип функции, такая функция должна быть определена (реализована) за пределами класса. Если определение функции входит в тело класса, то оно строится так же, как и для функций, не входящих в классы. Если определение функции не содержится в классе, то она определяется отдельно (обычно определение класса записывается в заголовочном файле, а определения его функций – в отдельном файле с расширением «cpp»). Формат такого определения имеет следующий вид: