Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOAP.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
494.59 Кб
Скачать

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() ) означает, что функция не должна порождать исключений. Указание списка исключений ни в чему не обязывает:

  1. Если исключение предусмотрено, оно обрабатывается.

  2. Если – нет,

    1. вызывается стандартная функция unexpected(). При помощи функции set_unexpected() можно установить собственную функцию, определяющую действие программы в случае непредвиденной ситуации.

    2. По умолчанию вызывается функция terminate(),

      1. которая по умолчанию вызывает функцию abort(), завершающую выполнение программы.

      2. При помощи функции 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 символов строки старого типа;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]