С++ - язык, который изучается постепенно.Присваивание.
                   Справочники Всё для создания сайта

Ссылки


Home
Бизнес
Справочники
Советы







Материалы книги получены с http://www.itlibitum.ru/

Присваивание

Ааааа! Эти зловредные пользователи когда-нибудь угомонятся?!

MP<Foo> mpf1;

MP<Foo> mpf2;

mpf2 = mpf1; // Нет, только не это...

В приведенном фрагменте возникают сразу две проблемы. Во-первых, указываемый объект, созданный конструктором mpf2, никогда не удаляется. Он превращается в Летучего Голландца, обреченного на вечные скитания в океане памяти. Во-вторых, оператор =, используемый компилятором по умолчанию, копирует адрес, находящийся в t, из одного указателя в другой, что приводит к появлению двух ведущих указателей, ссылающихся на один объект. В исправленном варианте перегруженный оператор

= удаляет объект, на который ссылается левосторонний указатель, и заменяет его копией объекта, на который ссылается правосторонний указатель.

template <class Type>

class MP {

private:

Type* t;

public:

MP(); // Нормальный конструктор

MP<Type>& operator=(const MP<Type>& mp)

{

if (&mp != this) {

delete t;

t = new Type(*(mp.t));

}

return *this;

}

};

Разумеется, если вы вообще не хотите поддерживать присваивание, достаточно объявить оператор = закрытым.


Назад    Содержание    Далее    

Home  Создание сайтов  Учебник по записи CD  Справочник Web дизайнера Самоучитель IE PHP и MySQL Компьютерные сети С++ E-mail me

Copyright 2007. Климов Александр. All Right Reserved.
Hosted by uCoz