В чем секрет конструктора копирования.
Добавлено: 03 фев 2010, 11:00
Добрался до конструкторов копирования, но никак не могу осмыслить происходящее.
Может кто-нибудь схематично (на ячейках памяти) или может есть уже такая схема, объяснить как он работает?
Для разбора можно взять следующий пример:
Почему без передачи параметра по ссылке деструктор пытается очистить содержимое ячейки по одному адресу дважды? А при передаче параметра по ссылке (или все же взятие адреса?!) создает копию объекта в другой ячейке (по другому адресу)?
Расписал с адресами, как я это вижу:
Если передавать аргумент по ссылке...
object.c получит копию адреса str.c или temp.c или вобще что-то другое ???
P.S> чувствую, что близок к пониманию, осталась вот эта маленькая стеночка, которую не могу преодолеть.
Может кто-нибудь схематично (на ячейках памяти) или может есть уже такая схема, объяснить как он работает?
Для разбора можно взять следующий пример:
Код: Выделить всё
class StringVar
{
public:
~StringVar();
StringVar(char a[]);
StringVar(const StringVar& object);
private:
char *c;
int max_length;
};
StringVar::StringVar(char a[]) : max_length(strlen(a))
{
c = new char[max_length + 1]; //+1 for '\0'
strcpy(c, a);
}
StringVar::StringVar(const StringVar& object) : max_length(object.length())
{
c = new char[max_length + 1]; //+1 for '\0'
strcpy(c, object.c);
}
//=======
//Конструктор копирования
StringVar str("word");
StringVar temp(str);
Расписал с адресами, как я это вижу:
Код: Выделить всё
StringVar str("word");
|---> line.c = 0x33ff77
StringVar temp(str);
|---> temp.c = 0x11aa33
В соответствии с конструктором копирования мы передаем аргумент object (он же str) по значению.
В итоге: strcpy(0x33ff77, 0x11aa33).
object.c получит копию адреса str.c или temp.c или вобще что-то другое ???
P.S> чувствую, что близок к пониманию, осталась вот эта маленькая стеночка, которую не могу преодолеть.