Самоучитель C++ Part 001

Page 152

152

_

Самоучитель

C++

int get(int i) { return p[i] ;

/* Конструктор копий Память выделяется специально для копии, и адрес этой памяти передается в указатель р. Следовательно, указатель р больше не ссылается на ту же самую, где находится исходный объект, динамически выделенную область памяти: */ array: :array (const array &a) { int i; size = a. size; p=new int [a. size] ; // выделение памяти для копии if(!p) exit(l); f o r ( i = 0 ; i<a.size; i++) p [ i ] = a . p [ i ] ; / / копирование содержимого cout « "Использование конструктора копий \п";

int ma in ()

i

array num(10); // вызов обычного конструктора int i ; // помещение в массив нескольких значений for(i=0; i<10; i-н-) num. put (i, i) ; // вывод на экран массива пита for (i=9; i>=0; i — ) cout « num.get(i); cout « "\n"; // создание другого массива и инициализация его массивом пшп array x=num; // вызов конструктора копий // вывод на экран массива х for (i=0; i<10; i-н-) cout « x.get(i); return 0;

Когда массив пиш используется для инициализации массива х, вызывается конструктор копий и для нового массива по адресу х.р выделяется память, а содержимое массива пшп копируется в массив х. В этом случае в массивах х и num находятся одинаковые значения, но при этом — это совершенно различные массивы. (Другими словами, указатели х.р и num.p теперь не ссылаются на одну и ту же область памяти.) Если бы не был создан конструктор копий, то поразрядная инициализация при выполнении инструкции array x= пшп привела бы к тому, что массивы х и пшп оказались бы в одной и той же области памяти! (То есть, указатели х.р и num.p ссылались бы на одну и ту же область памяти.)


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.