|
|
|
| Вот пример из книги ШИЛДТА:
#include <iostream>
using namespace std;
class aray {
int *p;
int size;
public:
aray (int sz) {
p = new int[sz];
if(!p) exit(1);
size = sz;
cout << "Юзаем обычный конструктор: ";
}
~aray() { delete []p; }
aray(const aray &a);
void put(int i, int j) {
if(i>=0 && i<size) p[i] = j;
}
int get(int i) { return p[i]; }
};
aray::aray(const aray &a) {
int i;
size = a.size;
p = new int[a.size];
if(!p) exit(1);
for(i=0;i<a.size;i++) p[i] = a.p[i];
cout << "Юзаем конструктор копий: ";
}
int main()
{
system("chcp 1251");
aray 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";
aray x = num;
for(i=0;i<10;i++) cout << x.get(i);
cout << "\n";
}
|
Так вот собствено вопрос, зачем нужен конструктор копий? Почему я не могу сделать обычную функцию? Не могли бы вы сказать зачем имено он нужен (конструктор копий) на примере (без кода, просто вот пример)... | |
|
|
|
|
|
|
|
для: DEM
(09.01.2007 в 23:41)
| | Как зачем? Чтобы при создании копии объекта АВТОМАТИЧЕСКИ вызывалась некая функция. | |
|
|
|
|
|
|
|
для: Sergey89
(10.01.2007 в 00:01)
| | Нет здесь речь идёт не об обычном конструкторе, а о специальном конструкторе, который вызывается при инициализации одного объекта другим.
| |
|
|
|
|
|
|
|
для: DEM
(09.01.2007 в 23:41)
| | Если в объекте выделяется динамический кусок памяти (new), а потом один объект инициируется другим
, то без конструктора копии оба объекта будут указывать на одну и ту же область памяти (т.е. редактируем один объект, а второй меняется вслед за ним), а потом в довершение всего эту память по разу возратят в систему каждый из объектов (delete). Создавая конструктор копии, вы берёте процесс создания копии в свои руки и можете при копировании данных выделить дополнительный объём динамической памяти или просто переопределить этот процесс так как вам это хочется. Умный указатель auto_prt например, отбирает динамическую память у правого объекта и передаёт её левому. | |
|
|
|
|
|
|
|
для: DEM
(09.01.2007 в 23:41)
| | Просто при копировании обьекта по умолчанию происходит побайтовое копирование всей области памяти занимаемой обьектом. Это не всегда быстрее чем написать свой конструктор копирования. | |
|
|
|
|
|
|
|
для: Евгений Петров
(10.01.2007 в 01:42)
| | При выделении памяти под объект, ob1 а потом при выполнении операции присваивания obj2 = obj1 - в результате получится, что оба объекта будут указывать на одну и тоже область памяти, затем в случае освобождения памяти, выделенной под эти объекта, будет освобождаться одна и та же облсь памяти.... | |
|
|
|
|
|
|
|
для: Граон
(11.01.2007 в 00:54)
| | >При выделении памяти под объект, ob1 а потом при выполнении операции присваивания obj2 = obj1 - в результате получится, что оба объекта будут указывать на одну и тоже область памяти...
Почему?
Копирующий конструктор будет работать с памятью, выделенной под obj2. | |
|
|
|
|
|
|
|
для: Евгений Петров
(10.01.2007 в 01:42)
| | >>Просто при копировании обьекта по умолчанию происходит побайтовое копирование
Это смотря где: в С - да, а в С++ - не побайтовое, а почленное, т.е., если в объекте содержутся другие объекты, то для них будут вызваны их конструкторы копирования | |
|
|
|
|
|
|
|
для: DEM
(09.01.2007 в 23:41)
| | хааааааааааа
а и вправду зачем конструктор копий???!! ведь так никто и не дал ответа!!!
можно либо ссылочным типом, либо через указатель .. :) а нафига конструктор копий??!! | |
|
|
|
|
|
|
|
для: ssdmt
(18.01.2007 в 14:45)
| | >ведь так никто и не дал ответа!!!
Не совсем так... ответ дан. Конструктор копии, который генерирует компилятор (если его не реализует сам программист) не сможет корректно скопировать объект, если тот в свою очередь выделяет динамическую память. Просто термин "Конструктор копии" не совсем удачный и не сразу въезжаешь, что это такое, в других языка программирования (Java-объектноориентированных) это называется "клонированием" (мне кажется более удачный термин). "Глупый" конструктор копии который генерируется по умолчанию может только побайтово скопировать объект, в том числе и указатели на динамические объёмы памяти, сами объёмы памяти скопировать у него уже ни полномочий, ни ума не хватает - здесь нужно вручную работать, т.е. перегружать конструктор копии. | |
|
|
|