Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Конст-р копирования, Конст-р присваивания.

Читайте также:
  1. III. Проведение личного обыска, дактилоскопирования, фотографирования и досмотра вещей подозреваемых и обвиняемых.
  2. Конст-ры, деструкторы.
  3. Логические величины, операторы, выражения. Оператор присваивания.
  4. Оператор присваивания. Приоритет операций. Стандартные функции.
  5. Операторы перехода и оператор присваивания.
  6. Операции присваивания.

0бъект класса без конст-ров можно инициализировать путем присваивания ему другого объекта этого класса. Это можно делать и тогда, когда конст-ры описаны. По существу, имеется конст-р по умолчанию, определеный как почленая копия объекта того же класса. Если для класса X такой конст-р по умолчанию нежелателен, его можно переопределить конст-ром с именем Х(Х&). Семантика вызова по значению требует, чтобы локальная копия типа парама создавалась и инициализировалась от значения выражения, переданого как фактический парам. Для этого необходим конст-р копии. Компилятор предоставляет такой конст-р по умолчанию. Его сигнатура: ИмяКласа::ИмяКласа (const ИмяКласа &); Компилятор производит копирование путем почленой инициализации. Это не всегда применимо. В большинстве случаев, указатель явл адресом объекта, удаляемого при выходе из контекста. 0днако, код, в котором производится действие по дублированию значения указателя, а не объекта, на кот он указывает, может быть ошибочным. Дело в том, что удаление воздействует на др экземпляры, все еще предполагающие, что объект существует. Поэтому важно, чтобы класс имел свою собственую явно определеную копию конст-ра. Все хорошо разработаные классы должны иметь конст-р копирования, особено те, кот имеют дело с динамической памятью, открытыми файлами, любыми указателями.

Конст-р присваивания: Исп-ние указателей - членов класса может привести к утечке памяти при обычном присваивании. Поэтому при разработке класса хорошим стилем считается обязательное исп-ние перегруженого оператора присваивания. Для класса с именем х оператор вида х& operator= (const x &) назется конст-ром присваивания. Иногда такое действие назют глубоким копированием, в то время как не перегруженый оператор присваивания назется поверхностным копированием. Вышеприведеный способ перегрузки оператора присваивания для класса intarray не решает полностью все проблемы. Пример: intarray *а, *b; a=new intarray(2); b=new intsortedarray(2); a->setitem(0,3); b->setitem(0,l); intsortedarray *v=dynamic_cast<intsortedarray*>(b);

if (v) v->setsorted(true); *b=*a; В рез-те работы этого фрагмента у объекта *b даные - члены класса будут несогласованы - масив будет не упорядочен, в то время как функция issorted() вернет значение true. Для устранения этой проблемы необходимо добавить к конст-ру присваивания класса intarray модификатор virtual и у каждого производного класса необходимо его переопределять. Напр, для класса intsortedarray можно использовать реализацию оператора присваивания: intarray& intsortedarray::operator=(const intarray &a) {intarray::operator=(a);

const intsortedarray *w=dynamic_cast<const intsortedarray*>(&a); if (w) fsorted=w->fsorted;

else if (fsorted) sort(); return *this;};




Дата добавления: 2015-01-29; просмотров: 25 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав