Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
54
Добавлен:
15.06.2014
Размер:
478.21 Кб
Скачать

Вопрос 46. Класс auto_ptr и динамич выделение памяти.

Обычной стратегией работы с динамической памятью является выделение некоторого пространства (возможно, объекта) в области свободной памяти, присваивание адреса выделенной памяти указателю, использование этого указателя для манипулирования памятью и освобождения памяти с помощью delete, когда она больше не нужна. Если после того, как память была выделена, и до того, как будет выполнен оператор delete, возникает исключение, может иметь место утечка памяти. Шаблон класса auto_ptr для разрешает данную ситуацию.

Объект класса auto_ptr хранит указатель на динамически выделенную память. Когда объект auto_ptr выходит из области действия, он выполняет над своим элементом-указателем операцию delete. Шаблон класса auto_ptr предусматривает операции * и -> , чтобы с объектом auto_ptr можно было обращаться как с обычной переменной-указателем.

class Integer

{ public:

Integer(int i=0):Value(i)

{

cout<<”Конструктор Integer ”<<value;

}

~Integer()

{

cout<<”Деструктор Integer”<<value;

}

void setInteger() const

{

return value;

}

private:

int value;

}

int main()

{

auto_ptr<Integer> ptrToInteger(new Integer(7));

ptr ToInteger->setInteger(99);

cout<<(*ptrToInteger).getInteger();

}

Вопрос 47. Static_cast, reinterpret_cast

Основные формы

static_cast< целевой тип >(выражение)

reinterpret_cast < целевой тип >(выражение)

Здесь <целевой тип> - это тип, к-ым должен стать тип параметра (выражение) после выполнения операции приведения типов.

Оператор static_cast предназначен для выполнения операции приведения типов над объектами неполиморфных классов. Может выполнять любую стандартную операцию преобразования, но не во время выполнения программы).

Оператор reinterpret_cast даёт возможность преобразовать указатель одного типа в указатель совершенно другого типа. Он также позволяет приводить указатель к типу целого и целое к типу указателя. Используется для выполнения операции приведения внутренне несовместимых типов указателей.

//пример оператора reinterpret_cast

#include <iostrean.h>

int main(){

int I;

char *p=”This is a string”;

i=reinterpret_cast<int>(p);..преобразование указателя к целому

cout<<i;

return 0;

}

Вопрос 48. Инфо о типе времени выполнения. Оператор dynamic_cast

Используя идентификацию типа времени исполнения (run-time-type-identification — RTTI) можно определить тип объекта во время исполнения программы. Для этого используется функция typeid (оператор для выявления типа объекта). Общая форма записи имеет вид: typeid(А). Здесь А - объект, чей тип требуется определить. Функция typeid возвращает ссылку на объект типа typeinfo, который описывает тип объекта А.

Когда функция typeid применяется к указателю на базовый класс полиморфного класса, она автоматически возвращает тип объекта, на к-ый указывает ук-ль, в том числе любой класс, выведенный из базового класса.

RTTI не явл-ся, тем средством, к-ое используется всякой программой. Однако при работе с полиморфными типами она позволяет знать тип объекта в любой ситуации.

Оператор dynamic_cast

Оператор dynamic_cast относится непосредственно к RTTI. Он реализует преобразования, приведение типов в динамическом режиме, что позволяет контролировать правильность этой операции во время работы программы. Если при выполнении оператора dynamic_cast приведение типов не произошло, будет выдана ошибка приведения типов. Основная форма:

dynamic_cast<целевой тип>(выражение)

<целевой тип> - это тип, которым должен стать тип параметра (выражение) после выполнения операции приведения типов. Оператор dynamic_cast используется для приведения типа одного указателя к типу другого или типа одной ссылки к типу другой.

При неудачной попытке приведения типов результатом выполнения оператора является NULL, если в операции использовались указатели. Если же в операции использовались ссылки, возбуждается исключительная ситуация bad_cast.

Осн. применение:

  • приведение полиморфных типов. Например, пусть имеются два полиморфных класса B и D, где D выведено из B. Оператор dynamic_cast всегда может привести указатель D* к указателю B*. Оператор dynamic_cast может привести указатель В* к указателю D* только в то м случае, если указатель фактически указывает на объект D.