43434 (762095), страница 2
Текст из файла (страница 2)
a = b; // Вызов операции присваивания
POINT Foo(); // Возврат по значению, вызывает копирование
void Foo(POINT); // Передача по значению, создает копию
Во всех этих случаях выполняется копирование. В ходе выполняемой компилятором оптимизации могут появиться и другие варианты. Это та область, где знание действительно сила, способная помочь вам избежать утечек памяти.
В операторе типа POINT х = у; не вызывается операция присваивания класса POINT, хотя на первый взгляд выглядит это именно так. Причина состоит в том, что операция присваивания - это функция-член, а значит может быть вызвана только для уже существующих объектов, в то время как в этом фрагменте происходит создание нового объекта х.
Если объект создается в той же строке, в которой он выступает в качестве левостороннего аргумента, то вызывается конструктор. Строка
Х х = у; // вызов конструктора копий
эквивалентна строке
Х х(у); // вызов конструктора копий
БИКЮ , что совсем не то же самое, что
Х х, у;
х = у; // вызов операции присваивания
Вам следует понимать, что же на самом деле вызывается, когда и почему. Это одна из тех особенностей, благодаря которым C++ труднее и интерес-нее, чем С. В предыдущем разделе мы пришли к заключению, что не стоит определять операцию присваивания без конструктора копий и наоборот.
Следовательно, напрашивается вывод, что основные рекомендации для операции присваивания справедливы также и для конструктора копий.
На этом, пожалуй пока и остановимся. Небольшое резюме напоследок.
Если класс содержит указатели или ссылки, то скорее всего вам придется определять операцию присваивания и конструктор копий для этого класса самостоятельно, не полагаясь на компилятор. В противном случае можно спокойно использо-вать созданные компилятором присваивание и копирование, но при этом по-лезно упомянуть об этом в комментариях к классу.
Список литературы
P.Kimmel Using Borland C++ 5 Special Edition перевод BHV - С.Петербург 1997
C++. Бархатный путь Марченко А.Л. Центр Информационных Технологий
www.citmgu.ru
Thinking in C++, 2nd ed. Volume 1 c2000 by Bruce Eckel
Для подготовки данной работы были использованы материалы с сайта http://my-pc.jino.ru/