ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн
Инициализация копирования и присваивания
Компилятор C++ всегда стоит на вашей стороне, выполняя рутинную работу,
которой программиста незачем загружать. Если вы обязуетесь контролировать
ситуацию, он может посчитаться с вашим мнением и предоставить некоторые во-
просы решать самому, но по умолчанию компилятор все делает сам. Двумя чрез-
вычайно важными примерами этого процесса являются оператор присваивания
и конструктор копирования.
Вы постоянно пользуетесь оператором присваивания, может быть, даже не
задумываясь о том, что за ним стоит с точки зрения компилятора. Пусть a1 и
а2 — некоторые объекты. Несмотря на то, что вы говорите компилятору: «при-
своить а2 значение а1», выражение
а2 = a1;
заставит компилятор копировать данные из a1 элемент за элементом в а2. Тако-
вы действия по умолчанию для оператора присваивания.
Вы, возможно, знакомы с инициализацией переменных. Инициализация одно-
го объекта другим, как в выражении
alpha a2(a1); //инициализировать а2 значением a1
вызывает подобные действия. Компилятор создает новый объект а2, затем эле-
мент за элементом копирует данные из a1 в а2. Это то, что по умолчанию выпол-
няет конструктор копирования.
Оба этих стандартных действия выполняются без проблем компилятором.
Если поэлементное копирование из одного объекта в другой — это то, что вам
нужно, то можно больше ничего не предпринимать в этом направлении. Тем
не менее, если вы хотите научиться заставлять присваивание или инициализа-
цию выполнять какие-либо более интеллектуальные действия, то придется разо-
браться в том, как обойти стандартную реакцию на эти операторы. Обсуждать
технику перегрузки оператора присваивания и конструктора копирования мы
будем отдельно друг от друга, затем соединим полученные знания в один при-
мер, который дает возможность классу String более эффективно использовать
память. Кроме этого, вы узнаете об объектной диаграмме UML.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
