Инструменты пользователя

Инструменты сайта


klass_auto_ptr

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

klass_auto_ptr [2011/02/03 06:58] (текущий)
Строка 1: Строка 1:
 +====== auto_ptr ======
 +Класс **auto_ptr** (automatic pointer - автоматический указатель). Данный класс предоставляется стандартной библиотекой С++ и предназначен для работы с объектами,​ которые обычно необходимо удалять явно (например,​ объекты,​ созданные динамически с помощью оператора new). 
 +
 +Для создания объекта класса auto_ptr параметром конструктора должен быть указатель на объект,​ созданный динамически. Дальше c auto_ptr можно работать почти как с обычным указателем,​ который указывает на тот же динамический объект,​ на который указывал исходный указатель.
 +
 +Синтаксис класса auto_ptr в стандартной библиотеке выглядит так: ​
 +<​file>​
 +template<​class X>
 +
 +class Std::​auto_ptr
 +{
 + X* ptr;
 +
 +public:
 +
 + //​конструктор и деструктор
 +
 + explicit auto_ptr(X* p = 0)throw()
 + {
 +
 + ptr = p;
 +
 + }
 +
 + ~auto_ptr() throw()
 + {
 +
 + delete ptr;
 +
 +
 + ​ //​оператор разыменования позволяет получить объект
 +
 + X& operator*()const throw()
 + {
 +
 + return *ptr;
 +
 +
 +       ​ //​оператор -> позволяет получить указатель
 +
 + X* operator->​()const throw()
 + {
 +
 + return ptr;
 +
 + }
 +
 +};
 +</​file>​
 +
 +<​note>​Кроме переопределения операторов -> и *, класс auto_ptr содержит две функции-члена:​
 +X* get () const; - возвращает указатель на объект класса,​ скрывающегося под шаблоном X
 +X* release () const; - возвращает указатель на объект класса,​ скрывающегося под шаблоном X, но при этом забирает у auto_ptr права на этот объект. ВНИМАНИЕ!!! Сам объект не уничтожается!!!</​note> ​
 +
 +Рассмотрев общую конструкцию auto_ptr, полюбопытствуем,​ как он выглядит в работе: ​
 +<​file>​
 +#include <​iostream>​
 +#include <​memory>​
 +using namespace std;
 +
 +class TEMP{
 + public:
 + TEMP(){
 + cout<<"​TEMP\n\n";​
 + }
 + ~TEMP(){
 + cout<<"​~TEMP\n\n";​
 + }
 + void TEST(){
 + cout<<"​TEST\n\n";​
 + }
 +};
 +void main(){
 + // создаём два автоматических указателя
 + // под один из них выделяем память типа TEMP
 + auto_ptr<​TEMP>​ptr1(new TEMP), ptr2;
 +
 + // передача права владения
 + ptr2=ptr1;
 +
 + // вызов функции через автоматический указатель
 + ptr2->​TEST();​
 +
 + // присваивание автоматического указателя
 + // обычному указателю на объект класса
 + TEMP*ptr=ptr2.get();​
 +
 + // вызов функции через обычный указатель
 + ptr->​TEST();​
 +}
 +</​file>​
  
klass_auto_ptr.txt · Последние изменения: 2011/02/03 06:58 (внешнее изменение)