Программирование >>  Расширенная версия языка c++ 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 227


Конструктор копий вызывается только для инициализации. Например, следующая последовательность инструкций не ведет к определенного в

предыдущей программе конструктора копий:

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;



1 ... 46 47 48 [ 49 ] 50 51 52 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика