Программирование >>  Операторы преобразования типа 

1 ... 13 14 15 [ 16 ] 17 18 19 ... 239


return strm;

int mainO {

const auto ptr<1nt> p(new 1nt(42)): const auto ptr<1nt> q(new int(O)): const auto ptr<1nt> r:

cout

after

initialization: endl:

cout

p endl:

cout

q--

q endl;

cout

Г:

г endl:

*q = *p;

*r = *p;

ОШИБКА: неопределенное поведение

*p = -77

cout

after

assigning values: endl:

cout

p--

p endl;

cout

q endl:

cout

r:

г endl:

q = P:

ОШИБКА КОМПИПЯЦИИ

r = p:

ОШИБКА компиляции

Результат выполнения программы:

after initialization; р: 42 q: О г: NULL

after assigning values: p: -77 q: 42 r: NULL

В примере определен оператор вывода для auto ptr, при этом объект auto ptr передается по константной ссылке. 1Сак упоминалось на с. 58, передавать auto ptr функциям не рекомендуется; данная функция является исключением.

Обратите внимание: следующее присваивание является ошибкой:

в этом присваивании производится разыменование экземпляра auto ptr, не ссылающегося на объект. В соответствии со стандартом это приводит к непредсказуемым последствиям (например, аварийному завершению программы). Как показывает приведенный пример, вы можете работать с объектами, на которые ссылается константный указатель auto ptr, но не можете изменять принадлежащие им объекты. Даже если бы переменная г была объявлена неконстантной, последняя команда была бы невозможной из-эа модификации константы р.



В тексте приводится слегка усовершенствованная версия, в которой исправлены некоторые недочеты стандарта С++ (тип auto ptr ref объявлен глобальным, а также добавлен оператор присваивания auto ptr ref в auto ptr; см. с. 69),

Подробное описание класса auto ptr

Класс auto ptr объявлен в заголовочном файле <memory>: #include <тетогу>

Шаблонный класс atJto ptr достзшен для всех типов в пространстве имен std. Точное объявление auto ptr выглядит так:

namespace std {

Вспомогательный тип. используемый при копировании и присваивании template <class Y> struct auto ptr ref {};

tempiate<class T> class auto ptr { public:

Тип значения

typedef T element type:

Конструктор

explicit auto ptr(T* ptr - 0) throwO;

Копирующие конструкторы (с неявный преобразованием типа) Обратите внимание - параметр обьяелен неконстантным! auto ptr(const auto ptr&) throwC); template<class U> auto ptr(auto ptr<U>&) throwO;

Присваивание (с неявным преобразованием типа)

Обратите внимание - параметр объявлен неконстантным!

auto ptr& operator= (auto ptr&) throwC); tempiate<class U>

auo ptr& operator= (auto ptr<U>&) throwO:

Деструктор -autoptrO throwO;

Обращение no указателю

T* getC) const throwO;

T& operator*C) const throwC):

T* operator->0 const throwO:

Освобождение принадлежащего объекта Т * release OthrowC): Повторная инициализация void resetСТ* ptr = 0) throwC);



Специальные преобразования.

используемые при копировании и присваивании

public;

auto ptr(auto ptr ref<T>) throwO: auto ptr& operator= Cauto ptr ref<T> rhs) throwC); tempiate<class U> operator auto ptr ref<U>() throwO: tempiate<class U> operator auto ptr <U>() throwO;

Ниже приведены подробные описания отдельных членов класса (сокращение auto ptr означает auto ptr<T>). Полный пример реализации класса auto ptr приведен на с. 70.

Определения типов

avto ptr::element type

Тип объекта, владельцем которого является auto ptr.

Конструкторы, присваивание и деструкторы

autoj?tr; .auto ptг О throwO О Конструктор но умолчанию.

О Создает экземпляр auto ptr, не владеющий никаким объектом. О Инициализирует значение auto ptr нулем.

explicit dutoj)tr::dutoj>tr (Т* ptr) throwO

О Создает экземпляр auto ptr, владеющий объектом, на который ссылается ptr, и указывает на него.

О После вызова *this становится владельцем объекта, на который ссылается ptr. Других владельцев быть не должно.

О Если указатель ptr не является null-указателем, он должен содержать значение, полученное при вызове new, потому что деструктор auto ptr автоматически вызывает delete для принадлежащего ему объекта.

О Конструктор не должен вызываться для значения, полученного при создании массива оператором new []. С массивами следует использовать контейнерные классы STL, представленные иа с. 88.

duto ptг.:3>utoj)tг Cauto ptr& ар) throwO

tempiate<class U> autoj?tr::auto ptг (auto ptr<U>& ap) throwO

О Копирующий конструктор (для неконстантных значений).

О Создает экземпляр auto ptr, к которому переходит право владения объектом, принадлежавшим экземпляру ар.

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



1 ... 13 14 15 [ 16 ] 17 18 19 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика