- •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
Catch ( std::bad_cast & ) { // обработка исключения
}
p->fA(); // это никогда не выполнится
...
В С++, наряду с преобразованием динамических типов имеется возможность выяснения типов выражений непосредственно при выполнении программы (run-time type identification – RTTI). Средства поддержки RTTI описаны в заголовочном файле typeinfo.h. Их основу составляет класс std::type_info, который инкапсулирует информацию о типе объекта и функции для работы с ней. В нем есть, например, функция name, возвращающая строку с именем текущего типа объекта. Имеется также функция before, позволяющая проверить лексикографическую упорядоченность имен двух типов.
Выяснение типа выражения реализуется унарной операцией typeid. Если операция typeid срабатывает без ошибок, то ее результатом является ссылка на константный статический объект класса std::type_info, содержащий информацию о типе операнда (на каждый тип получается уникальный объект type_info, так что сравнение типов можно заменить сравнением адресов этих объектов). Аргументом операции typeid может быть леводопустимое выражение (lvalue), дающее полиморфный класс, а также идентификатор типа; кроме того, аргументом может быть выражение неполиморфного типа. Если аргумент – lvalue полиморфного типа, то typeid определяет текущий динамический тип аргумента. Если же аргумент – идентификатор типа, то результатом является информация о данном типе. Наконец, если аргументом является выражение неполиморфного типа, то typeid определяет его статический тип. Операция typeid может завершиться с ошибкой (например, когда аргумент – разыменованный нулевой указатель); в этом случае выбрасывается исключение класса std::bad_typeid (также определен в файле typeinfo.h).
Приведенный ниже пример показывает различные варианты использования механизма RTTI.
Пример
#include <iostream> // для cout, endl
// иерархия полиморфных классов
class A {
public:
virtual void fA() {}
};
class B: public A {
public:
void fB() {}
};
class C: public B {
public:
void fC() {}
};
class D: public B {
public:
void fD() {}
};
class E: public D {
public:
void fE() {}
};
int main() {
// объекты с различными модификаторами
C c;
const D d;
volatile E e;
A * pA = &c; // модификация динамического типа
std::cout << "typeid(*pA) = " << typeid(*pA).name() << std::endl
<< "typeid(c) = " << typeid(c).name() << std::endl
<< "typeid(pA) = " << typeid(pA).name() << std::endl;
// выведет:
// typeid(*pA) = C
// typeid(c) = C
// typeid(pA) = A *
pA = const_cast<D*>(&d); // модификация динамического типа
std::cout << "typeid(*pA) = " << typeid(*pA).name() << std::endl
<< "typeid(d) = " << typeid(d).name() << std::endl;
// выведет:
// typeid(*pA) = D
// typeid(d) = D
pA = const_cast<E*>(&e);
std::cout << "typeid(*pA) = " << typeid(*pA).name() << std::endl
<< "typeid(E) = " << typeid(E).name() << std::endl;
// выведет:
// typeid(*pA) = E
// typeid(e) = E
if ( typeid(*pA) == typeid(E) ) {
// условие есть true
std::cout << "typeid(*pA) < typeid(C) == "
<< ( typeid(*pA).before( typeid(C) ) ?
"true" : "false" ) << std::endl;
// выведет: typeid(*pA) < typeid(C) == false
std::cout << "typeid(*pA) > typeid(C) == "
<< ( typeid(C).before( typeid(*pA) ) ?
"true" : "false" ) << std::endl;
// выведет: typeid(*pA) > typeid(C) == true
}
