Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [c++] Объясните про конструктор копии  (Прочитано 9428 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 10-08-2009 14:39 » 

Привет. Чего-то я запутался совсем.
Не всё понятно про конструктор копии, объясните пожалуйста.

Вот есть некий класс
Код:
class one
{
   int *p;
public:
   one(int i) {p=new int(i);} /*обычный конструктор, выделяет память для члена p и инициализирует её значением i*/
   ~one() {delete p;}
   one(const one &obj) //конструктор копии
   {
       p=new int;  /*тут p - это чей член? this->p или p объекта копии, который создаётся внутри этого конструктора копии? Если первое, то не ясно, получается раннее выделенная память (обычным конструктором) уже остаётся без указателся, так как этот указатель уже указывает на другую область, получается утечка? Значит .надо было перед этой инструкцией сначало освободить память, на которую указывает p: delete p;?
*/
       *p=*obj.p;
   }
};
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 10-08-2009 14:42 » 

При создании класса, конструктор класса вызывается только один раз. Какой именно, компилятор сам выбирает по умолчанию. И его выбор зависит от параметров создания экземпляра класса.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-08-2009 14:49 » 

Если для класса не определен конструктор копии, то в таких случая будет снова вызван конструктор класса:
 
Код:
func(myclass obj);
т.е. когда класс передаётся в качестве аргумента некой функции.
Или таких:
Код:
myclass a(10), b;
b=a;

Поэтому я спросил про конструктор копии. Для подобных случаев он и нужен.
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 10-08-2009 14:55 » 

Я ерунду написал, хотел сказать, что если для класса не определён конструктор копии, то в таких случаяъ будет вызван конструктор копии по умолчанию, который обеспечивает побитовое копирование.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 10-08-2009 14:59 » 

The Nameless One,
p - это this->p для только что созданной копии, которую инициализируем с помощью obj Улыбаюсь

Копирующий конструктор, как и явствует из названия, создаёт один новый экземпляр, инициализируя его значениями из старого экземпляра (obj).

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

Даже если ты явно не опишешь этот конструктор, компилятор сгенерирует реализацию по умолчанию - но она будет делать поверхностное копирование - на твоём примере хорошо видно, что переопределение копирующего конструктора нужно для того, чтобы избежать проблемы с копированием указателей вместо копирования данных.
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 10-08-2009 15:10 » 

Вад, я во всем разобрался - большое спасибо!!!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines