|
Программирование >> Операторы преобразования типа
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:
Результат выполнения программы: 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-указателю. Таким образом, в отличие от обычных реализаций копирующего конструктора происходит модификация исходного объекта.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |