|
Программирование >> Расширенная версия языка c++
Конструктор копий вызывается только для инициализации. Например, следующая последовательность инструкций не ведет к определенного в предыдущей программе конструктора копий: array a НО] ; array Ь (10) ; b = а; конструктор копий не вызывается В данном случае инструкция b = а представляет собой операцию присваивания. 2. Чтобы понять, как конструктор копий помогает предотвратить некоторые проблемы, связанные с передачей функциям объектов определенных типов, рассмотрим неправильную программу: В этой программе имеется ошибка #include <iostream> ttinclude <cstring> ttinclude <cstdlib> using namespace std; class strtype ( . char p; public: strtype(char *s); -strtype0 {delete [] p;} char *get() (return p; } strtype:: strtype(char *s) int 1; .l Strlen(s)+1; p=new cha r[1]; if(lp) { cou Ошибка выделения памяти\п ; exit(l); strcpy(p, 3); J . У .. voi trtype x) 1 char *s; s=x.get() ; cout s \n ; 154 Самоучигель C++ int main () i Strtype a ( Hello ) , Ь ( There ) ; .\. ,.; ->.r show(a); show(b); return 0; В это амме, когда объект типа strtype передается в функцию show(), создается поразрядная копия объекта (поскольку не был определен конструктор копий) и передается параметру х. Таким образом, когда функция возвращает свое значение, х выходит из области видимости и удаляется. Это, естественно, приводит к вызову деструктора объекта х, который освобождает область памяти по адресу х.р. Однако освобожденная память - это та самая память, которую продолжает занимать объект, используемый при вызове функции. Это приводит к ошибке. Решение предыдущей проблемы лежит в определении конструктора копий для класса strtype, который при создании копии объекта типа strtype выделяет для нее память. Такой подход используется в следующей, исправленной версии программы: /* В этой программе используется конструктор копирования, что позволяет передавать кции объекты типа strtype #include <iostream> #include <cstring> ttinclude <cstdlib> . - using namespace std; class strtype { char public: strtype(char *s) ; конструктор strtype (const strtype &o) ; конструктор копий ~strtype() (delete p; } деструктор char -get (1 {return p; } Обычный конструктор strtype: : strtype(chaг*s) ( int 1; l=strlen(s)+1; p=new char [1] ; if(!p) С cout Опшбка выделения памяти\п ; Теперь, когда функции tow() завершается и объект х выходит из области видимости, память, на которую ссылается указатель х.р (освобождаемая память), - это уже не та память, которая используется переданным в функцию объектом. УпраАнеиия Конструктор копий вызывается и в тех случаях, когда функция генерирует временный объект, используемый в качестве ее возвращаемого значения (для тех функций, которые возвращают объекты). Зная это, рассмотрим следующий результат работы программы: exitd); strcpy(р, s) ; Конструктор копий ; Strtype: : strtype (const strtype &o) int 1; l=strlen(o.p)+1; ; p=new char[l] ; выделение памяти дл вой копии if(!p) { cout Опшбка выделения памяти\п ; exit(l); strcpy о,р) ; копирование строки в копию voi strtype x) char *s; s=x.get(); cou s << \n ; int mainO strtype a ( Hello ) , b( There ); show(a); show(b); return 0;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |