Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры(ооп) кроме 45,46,52.docx
Скачиваний:
2
Добавлен:
24.09.2019
Размер:
117.21 Кб
Скачать

12.Виртуальный деструктор

Практически всегда деструктор делается виртуальным. Делается это для того, чтобы корректно (без утечек памяти) уничтожались объекты не только заданного класса, а и любого производного от него.

class Father{public: Father() {} virtual ~Father() {} };

class Son : public Father{private: int* buffer;public:

Son() : Father() { buffer = new int[1024]; }

virtual ~Son() { delete[] buffer; }};

т 7 8 }

return 1; }

14.Совместное использование шаблонов и наследование

Шаблоны и наследование представляют собой механизмы повторного использования кода и могут включать полиморфизм. Шаблоны и наследования связаны между собой следующим образом: – шаблон класса может быть порожден от обычного класса; – шаблонный класс может быть производным от шаблонного класса; – обычный класс может быть производным от шаблона класса.

emplate <class T> class vect {protected: T *ms; int size; public: vect(int n) : size(n) { ms=new T[size];}

~vect(){delete [] ms;} T &operator[](const int ind)

{ if((ind>0)&&(ind<size))return ms[ind];else return ms[0];}};

template <class T> class oper : public vect<T>

{ public: oper(int n): vect<T>(n) {} ~oper(){}

void print(){ for(int i=0;i<size;i++) cout<<ms[i]<<' '; cout<<endl; } };void main()

{ oper <int> v_i(4); oper <double> v_d(4);

v_i[0]=5;v_i[1]=3;v_i[2]=2;v_i[3]=4;v_d[0]=1.3;v_d[1]=5.1;

v_d[2]=.5;v_d[3]=3.5;cout<<"int вектор = "; v_i.print();

cout<<"double вектор = ";v_d.print(); }

15.Реализация smart-указателя

Умный указатель (smart pointer) — класс (обычно шаблонный), имитирующий интерфейс обычного указателя и добавляющий некую новую ункциональность, например проверку границ при доступе или очистку памяти. Умные указатели (Smart pointers) - это, объекты, которые хранят указатели на динамическую память. Они действуют аналогично обычным указателям C++, за исключением того, что автоматически освобождают память в необходимый момент.

Если при использовании в программе указателя на объект, память для которого выделена с помощью оператора new, объект становится не нужен, то для его разрушения необходимо явно вызвать оператор delete. В то же время на один объект могут ссылаться множество указателей и, следовательно, нельзя однозначно сказать, нужен ли еще этот объект или он уже может быть уничтожен. Рассмотрим пример реализации класса, для которого происходит уничтожение объектов, в случае если уничтожается последняя ссылка на него. Это достигается тем, что наряду с указателем на объект хранится счетчик числа других указателей на этот же объект. Объект может быть уничтожен только в том случае, если счетчик ссылок станет равным нулю.

16.Классы поддерживающие транзакцию

Транзакция — в информатике, группа последовательных операций, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта.

Транзакция - это операция или набор операций, которые либо все будут произведены успешно, либо ни одна из них не будет применена. Если транзакция завершилась успешно, то все ее операции будут применены к данным хранилища. Если в процессе транзакции произошла хотя бы одна ошибка, то ни одна из ее операций не будет применена.Этот пример демонстрирует процесс использования транзакций: увеличение существующего числового значения свойства объекта.

def increment_counter(key, amount):obj = db.get(key)

obj.counter += amount obj.put()

Этот код требуется выполнять в рамках одной транзакции, так как между операциями db.get(key) и obj.put() может произойти изменение объекта другим пользователем. Без использования транзакции запрос пользователя будет использовать значение obj.counter до его изменения и операция obj.put() перезапишет последнее. Исполнение этого кода в рамках транзакции гарантирует, что объект не будет изменен между двумя обращениями к хранилищу. Если объект изменяется в результате другой транзакции, то она будет повторена несколько раз, до тех пор, пока все ее операции не будут проведены успешно.

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