Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Конструктор копий
 
 автор: DEM   (09.01.2007 в 23:41)   письмо автору
 
 

Вот пример из книги ШИЛДТА:

#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";


}


Так вот собствено вопрос, зачем нужен конструктор копий? Почему я не могу сделать обычную функцию? Не могли бы вы сказать зачем имено он нужен (конструктор копий) на примере (без кода, просто вот пример)...

  Ответить  
 
 автор: Sergey89   (10.01.2007 в 00:01)   письмо автору
 
   для: DEM   (09.01.2007 в 23:41)
 

Как зачем? Чтобы при создании копии объекта АВТОМАТИЧЕСКИ вызывалась некая функция.

  Ответить  
 
 автор: cheops   (10.01.2007 в 01:44)   письмо автору
 
   для: Sergey89   (10.01.2007 в 00:01)
 

Нет здесь речь идёт не об обычном конструкторе, а о специальном конструкторе, который вызывается при инициализации одного объекта другим.
cls obj = obj1;

  Ответить  
 
 автор: cheops   (10.01.2007 в 01:42)   письмо автору
 
   для: DEM   (09.01.2007 в 23:41)
 

Если в объекте выделяется динамический кусок памяти (new), а потом один объект инициируется другим
cls obj = obj1;

, то без конструктора копии оба объекта будут указывать на одну и ту же область памяти (т.е. редактируем один объект, а второй меняется вслед за ним), а потом в довершение всего эту память по разу возратят в систему каждый из объектов (delete). Создавая конструктор копии, вы берёте процесс создания копии в свои руки и можете при копировании данных выделить дополнительный объём динамической памяти или просто переопределить этот процесс так как вам это хочется. Умный указатель auto_prt например, отбирает динамическую память у правого объекта и передаёт её левому.

  Ответить  
 
 автор: Евгений Петров   (10.01.2007 в 01:42)   письмо автору
 
   для: DEM   (09.01.2007 в 23:41)
 

Просто при копировании обьекта по умолчанию происходит побайтовое копирование всей области памяти занимаемой обьектом. Это не всегда быстрее чем написать свой конструктор копирования.

  Ответить  
 
 автор: Граон   (11.01.2007 в 00:54)   письмо автору
 
   для: Евгений Петров   (10.01.2007 в 01:42)
 

При выделении памяти под объект, ob1 а потом при выполнении операции присваивания obj2 = obj1 - в результате получится, что оба объекта будут указывать на одну и тоже область памяти, затем в случае освобождения памяти, выделенной под эти объекта, будет освобождаться одна и та же облсь памяти....

  Ответить  
 
 автор: Trianon   (11.01.2007 в 10:32)   письмо автору
 
   для: Граон   (11.01.2007 в 00:54)
 

>При выделении памяти под объект, ob1 а потом при выполнении операции присваивания obj2 = obj1 - в результате получится, что оба объекта будут указывать на одну и тоже область памяти...

Почему?
Копирующий конструктор будет работать с памятью, выделенной под obj2.

  Ответить  
 
 автор: Фитч   (11.01.2007 в 20:29)   письмо автору
 
   для: Евгений Петров   (10.01.2007 в 01:42)
 

>>Просто при копировании обьекта по умолчанию происходит побайтовое копирование

Это смотря где: в С - да, а в С++ - не побайтовое, а почленное, т.е., если в объекте содержутся другие объекты, то для них будут вызваны их конструкторы копирования

  Ответить  
 
 автор: ssdmt   (18.01.2007 в 14:45)   письмо автору
 
   для: DEM   (09.01.2007 в 23:41)
 

хааааааааааа
а и вправду зачем конструктор копий???!! ведь так никто и не дал ответа!!!

можно либо ссылочным типом, либо через указатель .. :) а нафига конструктор копий??!!

  Ответить  
 
 автор: cheops   (18.01.2007 в 16:45)   письмо автору
 
   для: ssdmt   (18.01.2007 в 14:45)
 

>ведь так никто и не дал ответа!!!
Не совсем так... ответ дан. Конструктор копии, который генерирует компилятор (если его не реализует сам программист) не сможет корректно скопировать объект, если тот в свою очередь выделяет динамическую память. Просто термин "Конструктор копии" не совсем удачный и не сразу въезжаешь, что это такое, в других языка программирования (Java-объектноориентированных) это называется "клонированием" (мне кажется более удачный термин). "Глупый" конструктор копии который генерируется по умолчанию может только побайтово скопировать объект, в том числе и указатели на динамические объёмы памяти, сами объёмы памяти скопировать у него уже ни полномочий, ни ума не хватает - здесь нужно вручную работать, т.е. перегружать конструктор копии.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования