В чем секрет конструктора копирования.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

А где это вы такое вычитали что при передачи параметра по значению указатели будут указывать на одну ячейку памяти? это будут разные адреса, т.к. это разные объекты хоть и одного типа.
Может не так выразился. Но вобщем я это представлял так (поправьте, если не прав):
int a = 5;

- func(int x);
func(a); - создаст локальную копию переменной.

- func(int& x);
func(a); - передача по ссылке; передаем адрес переменной, работаем напрямую, а не с копией.

int *p1, *p2, b(7);
p1 = &a;
p2 = &b;
*p1 = *p2; - присваиваем содержимое указателя на переменную b указателю на переменную a
p1 = p2; - присваиваем указателю p1 значение указателя p2.

Ряд разных книг взял, разные статьи просмотрел и пришел к выводу, что работать (если не учитывать того, что компилятор просто не узнает конструктор копирования) будет по принципу "p1 = p2". Или деструктор будет воспринимать объекты в таком ключе.

Вобщем пришел к тому, что стандарт есть стандарт и от него уходить в сторону для понимания сути вещей (даже на время) лучше не стоит, будет хуже.

P.S> *зевая* утром надо будет почитать, что тут намалевал.... да и вообще "утро вечера мудренее"(с)народная мудрость.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

О вроде разрулили ситуацию... Конструктор копирования генерируемый компилятором при отсутствии явно описанных ведет себя как "p1 = p2", а в коде первого поста где вы явно описали конструктор копирования он поведет себя как "*p1 = *p2". Вы все правильно поняли...
И по этому поводу есть общепринятая рекомендация писать собственный конструктор копирования если есть в классе поле типа указатель на что либо.
А что в конструкторе применять или копирование данных в новую область памяти, или подсчет ссылок зависит от ситуации :)
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Почему без передачи параметра по ссылке деструктор пытается очистить содержимое ячейки по одному адресу дважды?
А... Оказывается данная фраза означает отсутствие конструктора копирования, а я-то подумал, что раз не по ссылке, то по значению. Хотя следующая цитата против:
Код взят из книги, рассматриваются указатели в классах и как-раз конструктор копирования, но как-то мутно описано, что не могу до конца понять "что будет, если передать параметр по значению", почему после деструктора очистятся оба объекта?
. Dragon, внесите ясность, что вы хотели понять. Это:
"что будет, если передать параметр по значению"
или это :
почему после деструктора очистятся оба объекта?
?
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

О вроде разрулили ситуацию...
Да :) Сильно лихо сформулировал изначально вопрос, но к цели добрались.
Теперь все встало на свои места.

Albor
Некорректно сформулировал вопрос (не в ту сторону смотрел, моя ошибка), приношу извинения.
Ответить