
- •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
CString(const char *);
может осуществлять преобразование строк в стиле С в объекты класса CString. Если записать
CString O = “строка”;
то константа «строка» будет преобразована в объект класса CString подходящим по типу конструктором этого класса.
Подобные неявные преобразования типов часто негативно влияют на качество кода (например, из-за них могут возникать нежелательные временные объекты), поэтому нужен способ их запрещения. Запретить использование конструктора для неявных преобразований типов можно путем придания конструктору атрибута explicit. Этот атрибут сообщает компилятору о том, что конструктор может применяться только для явного создания объектов, а все неявные преобразования типов на его основе нужно считать ошибкой. Атрибут explicit имеет смысл только для общих конструкторов, которые могут быть вызваны с одним аргументом. К их числу относятся, к примеру, такие, у которых более одного параметра, но все они, исключая первый, имеют значения по умолчанию.
Ниже в качестве примера приведен общий конструктор для класса CSqMatrix, который описывает квадратные матрицы. В конструкторе первый параметр задает размер матрицы, а второй определяет: нужно ли при создании матрицы обнулять ее элементы (по умолчанию элементы матрицы обнуляются).
explicit CSqMatrix(size_t size, bool zero = true);
Как только объект становится не нужен в программе, его целесообразно уничтожить. Локальные объекты уничтожаются автоматически при выходе из соответствующей сферы действия. Статические объекты также удаляются автоматически, но после завершения программы в целом. Динамические объекты автоматически не уничтожаются – их надо удалять явно с помощью операции delete (для массива объектов – операции delete[])2.
Когда объект уничтожается, вызывается его деструктор. Деструктор, так же как и конструктор, является компонентной функцией класса, но в отличие от конструктора может быть в классе только один. Основная задача деструктора – выполнить завершающие действия в ходе удаления объекта, например, освободить память, выделенную объектом (если, к примеру, один из компонент класса является динамическим массивом, то его удаление при уничтожении объекта – задача деструктора)3. Определяется деструктор следующим образом:
~class_id() {/*statements*/}
Деструктор не имеет параметров и не должен возвращать никаких значений. Имя его должно совпадать с именем класса class_id. Причем к имени обязательно дописывается префикс «тильда». Деструктор, подобно любой компонентной функции класса, может иметь внутреннее или внешнее определение. На операторы тела деструктора не накладываются ограничения.
Деструктор может быть вызван явно или неявно. Явный вызов деструктора – явление довольно редкое; как правило, деструктор вызывается неявно, например, когда управление выходит из сферы действия объекта, автоматически вызывается его деструктор. Если при уничтожении объектов не надо решать никаких задач, то деструктор можно вообще не определять. Однако следует помнить, что в этом случае компилятор автоматически создаст деструктор.
Ниже приведен пример внешнего определения деструктора для класса CMatrix, описывающего прямоугольные матрицы (здесь __nrows – число строк матрицы, а __thematrix – указатель на ее элементы).
Пример
CMatrix::~CMatrix() {
for(size_t i = 0; i < __nrows; i++) delete[] __thematrix[i];