
- •«Объектно-ориентированный анализ и проектирование»
- •1. Принципы ооп. Классы.
- •Описание классов.
- •Объекты класса.
- •Конструкторы
- •Конструктор копирования
- •Статические элементы класса
- •Дружественные функции и классы
- •Деструкторы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Рекомендации по составу классов
- •2. Наследование
- •Ключи доступа
- •Простое наследование
- •Пример замещения функций (практикум)
- •Виртуальные методы
- •Множественное наследование
- •3. Отношения между классами. Диаграммы класссов на языке uml.
- •4. Шаблоны классов.
- •4.1. Определения шаблонов классов Queue и QueueItem
- •4.2. Конкретизация шаблона класса
- •4.3. Аргументы шаблона для параметров-констант
- •4.4. Функции-члены шаблонов классов
- •5. Обработка исключительных ситуаций
- •5.1. Общий механизм обработки исключений.
- •5.2 . Синтаксис исключений
- •5.3. Перехват исключений
- •5.4. Исключения в конструкторах и деструкторах
- •Vector(int n) // Конструктор
- •5.5. Список исключений функции.
- •6. Строки
- •Преобразование строк
- •7. Контейнерные классы
- •7.1. Векторы.
- •7.2. Двухсторонние очереди (deque).
- •7.3. Списки (List).
- •7.4. Стеки
- •7.5. Очереди (queue)
- •7.6. Очередь с приоритетами(priority_queue)
- •8. Ассоциативные контейнеры
- •8.1. Словари (map)
- •8.2. Словари с дубликатами (multimap)
- •8.3. Множества (set)
- •8.4. Множества с дубликатами (multiset)
- •8.5. Битовые множества (bitset)
5.4. Исключения в конструкторах и деструкторах
Язык C++ не позволяет возвращать значение из конструктора и деструктора.
Механизм исключений дает возможность сообщить об ошибке, возникшей в конструкторе или деструкторе объекта. Для иллюстрации создадим класс Vector, в котором ограничивается количество запрашиваемой памяти:
class Vector{
public:
class Size{…}; // Класс исключения
enum {max = 32000}; // Максимальная длина вектора
Vector(int n) // Конструктор
{ if (n<0 || n>max ) throw Size();
...
}
}
При использовании класса Vector можно предусмотреть перехват исключений типа Size:
try{
Vector *р = new Vector(i):
}
catch Vector::Size(){ ... // Обработка ошибки размера вектора
}
В обработчике может использоваться стандартный набор основных способов выдачи сообщений об ошибке и восстановления. Внутри класса, определяющего исключение, может храниться информация об исключении, которая передается обработчику. Смысл этой техники заключается в том, чтобы обеспечить передачу информации об ошибке из точки ее обнаружения в место, где для обработки ошибки имеется достаточно возможностей.
Если в конструкторе объекта генерируется исключение, автоматически вызываются деструкторы для полностью созданных в этом блоке к текущему моменту объектов, а также для полей данных текущего объекта, являющихся объектами, и для его базовых классов. Например, если исключение возникло при создании массива объектов, деструкторы будут вызваны только для успешно созданных элементов.
Если объект создается в динамической памяти с помощью операции new и в конструкторе возникнет исключение, память из-под объекта корректно освобождается.
5.5. Список исключений функции.
В заголовке функции можно перечислить сбить исключений, которые она может порождать (в т.ч. и косвенно). Типы исключений перечисляются через запятую:
void func() throw(char, Monster* , … ) {...}
Если throw не указано, функция может порождать любое исключение, пустой список после throw ( throw() ) означает, что функция не должна порождать исключений. Указание списка исключений ни в чему не обязывает:
Если исключение предусмотрено, оно обрабатывается.
Если – нет,
вызывается стандартная функция unexpected(). При помощи функции set_unexpected() можно установить собственную функцию, определяющую действие программы в случае непредвиденной ситуации.
По умолчанию вызывается функция terminate(),
которая по умолчанию вызывает функцию abort(), завершающую выполнение программы.
При помощи функции set_terminate() можно установить собственную функцию, которая вызывается вместо abort() и определяется способ завершения программы.
#include <iostream>
using namespace std;
void SoftAbort()
{
cerr<< "Program is terminated." << endl;
exit(1);
}
int main()
{
set_terminate(SoftAbort);
throw 5;
return 0;
}
6. Строки
В С строка - массив символов, заканчивающиеся спец. символом.
В С++ - это класс.
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
int main ()
{ char c1[80],c2[80],c3[80];
string s1, s2, s3;
// pisnaivanie strok
strcpy (c1, "old");
strcpy(c2,c1);
s1="new";
s2=s1;
//concatenatuion
strcpy(c3,c1);
strcat(c3,c2);
s3 = s1 + s2;
//compare
if ( strcmp(c2, c3) == 0) cout << c2 << endl;
else cout <<c3<< endl;
if (s2 == s3) cout << s2<< endl;
else cout << s3<< endl;
)
Конструкторы и присваивание строк
string(); // пустой объект
string(const char*); // объект на основе старого типа
string(const char*,int n); // объект на основе старого тип (), записывает первые n символов из строки, указанной первым параметром;
string(string &); // копирование
Присваивание
string& operator=(const string & str); //
string& operator=(const char*); //
string& operator=(const char c); //
string s1, s2(“Vasia”), s3(s2);
s1=’X’;
s3=”Vasia”;
s2=s1;
Операции
= , + , == , != , < , > , <= , >=, [] , << , >> , +=
Функции
Присваивание и добавление частей строк
assign(const string & str); // =
assign (const char *str , size_t n); //// вызывающей строке присваивает n символов строки старого типа;
assign(const string & str , size_t pos, size_t n); // вызывающей строке присваиваются от pos n символов (out_of_range if pos));
#include <stdexcept>
class out_of_range: public logic_error
{…
public: explicit out_of_range(const string &what_arg);
};
append(const string & str); // +
append(const string & str , size_t pos, size_t n); // Добавляет к концу вызывающей строки часть строки str от pos n символов (out_of_range if pos, length_error));
append (const char *str , size_t n); // добавляет n символов строки старого типа;