|
Программирование >> Расширенная версия языка c++
strcpy (p, ob.p); . :. oio... return *this; ♦include <io3tream> #include <c3tring> #include <cstdlib> usin Space std; clas type { char *p; int len; public: strtype(char*g) ; { cout Освобождение памяти по адресу (unsigned) р Xn; delete []p; cha t(} { return p; } . . . strtype Strtype: : strtype (Char*s) . : ,. i. : int 1; 1 = strlen(s) + 1; . p = new char [1] ; if(!p} { - cout Опшбка выделения памятиХп ; г. > exit(l) ; ; } : 5;t , len =1; , , Присваивание. объекта strtype fistrtype: :operator= (strtype Sob} ,! { . выяснение необходости дополнительной памяти : .... if(len < ob.len) { требуется выделение дополнителвной памяти p; р = new char [ob.len]; . if(!p) { cout Опмбка выделения памятиХп ; exit(l); 1 -1 len = ob.len; . . , Как вы узнали из главы 5, создание конструктора копий - это другой путь решения проблем, описанных в двух предыдущих разделах. Но конструктор копий может оказаться не столь эффективным решением, как ссылка в качестве параметра и ссылка в качестве возвращаемого значения функции. Это происходит потому, что использование ссылки исключает затраты ресурсов, in in () л. , .f j .. . у strtype a ( Привет ) , Ь( Злесь ); . cout a.get О \n; cout b.getO \n; a = b; теперь указатель р не cout a.getO \n; cout b.getO \n; . . . return 0; .-.H;*!!-.---. j -чГ . Как видите, перегрузка оператора присваивания предотвращает перезапись указателя р. При первом контроле выясняется, достаточно ли в объекте слева от оператора присваивания выделено памяти для хранения присваиваемой ему строки. Если это не так, то память освобождается и выделяется новый фрагмент. Затем строка копируется в эту память, а длина строки копируется в переменную Отметьте два важных свойства функции operator=(). Во-первых, в ней используется парссылка. Это необходимо для предотвращения создания копии объекта, стоящего справа от оператора присваивания. Как известно по предыдущим главам, при передаче в функцию объекта создается его копия, и эта копия удаляется при завершении работы функции. В этом случае для удаления копии должен вызываться деструктор, который освобождает память, обозначенную указателем р. Однако память по адресу р все еще необходима объекту, который является аргументом. Параметр-ссылка помогает решить проблему. Вторым важным свойством функции operator=() является то, что она возвращает не объект, а ссылку на него. Смысл этого тот же, что и при обычном использовании параметра-ссылки. Функция возвращает временный объект, который удаляется после полного завершения ее работы. Это означает, что для временного объекта будет вызван деструктор, который вызовет освобождение памяти по адресу р, но указатель р (и память на которую он ссылается) все еще необходимы для присваивания значения объекту. Поэтому, чтобы избежать создания временного в качестве возвращаемого значения используется ссылка. Упражнения Пусть дано следующее объявление класса, добавьте все необходимое для создания типа динамический массив. То есть вгделите память для массива и сохраните указатель на эту память по адресу р. Размер массива в байтах сохраните в переменной size. Создайте функцию put(), возвращающую ссылку на заданный элемент массива и функцию get(), возвращающую значение заданного элемента. Обеспечьте контроль границ массива. Кроме этого перегрузите оператор присваивания так, чтобы вгделенная каждому массиву такого типа память не бхла случайно повреждена при присваивании одного массива другому. (В следующем разделе будет показан более совершенный способ решения этого упражнения.) int *p; . - int size; public: dynarray(int S); передача размера массива в переменной s in ЦпЬ i); возвращение ссылки на элемент i in Unt i); возвращение значения переменной i создайте функцию operator={) 6.7. Перегрузка оператора индекса массива [] Последним оператором, который мы научимся будет оператор индекса массива []. В C++ при перегрузке оператор [] рассматривается как бинарный. Оператор [] можно перегружать только как функцию-член. Ниже представлена основная форма оператор-функции - члена класса operator[] (): ти tatacса: : opera tor [] (int индекс) ( ... С технической точки зрения тип параметра не обязательно должен быть целым, но поскольку оператор-функция operator[](), как правило, используется для получения индекса массива, то ее параметр обычно имеет тип int. связанные ванием объекта в каждом из двух указанных случаев. Как видите, в С++ часто имеется несколько способов достижения одной и той же цели. Понимание их преимуществ и недостатков ~ это часть процесса вашего становления как профессионального программиста С++.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |