Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Что такое Copy-Konstruktor?


Автор: Wowa 14.2.2005, 15:42
Что такое Copy-Konstruktor?

Автор: chaos 14.2.2005, 15:58
это конструктор копирования )
Код

class T
{
...
public:
 T(const T&);
...
}

Автор: Wowa 14.2.2005, 15:59
Цитата(chaos @ 14.2.2005, 13:58)
это конструктор копирования )

ну и для чего он нужен? smile

Автор: azesmcar 14.2.2005, 16:02
Copy Constructor, само имя подсказывает копирующий конструктор...
Код

class A()
{
A( const A& p );
};



Предназначен для копирования одного обьекта в другого...
A t;
A o;
o = t; //Вызывается copy constructor
Если его не написать он генерируется автоматически, но бывают случаи когда его нужно переопределить...например ты пишешь класс для string -а вроде AnsiString.
Если присвоить один обьект другому получается что char * который хранится в нем просто просвоит адрес другого обьекта, а надо скопировать данные...
Надеюсь обьяснил нормально??? smile Если чего неясно пиши...

Автор: Wowa 14.2.2005, 16:11
А, т.е. это создано для копирования объектов? А я думал, что это что-то имеет общего с конструктор-функцией.

Автор: azesmcar 14.2.2005, 16:27
Извиняюсь, небольшая ошибка..
Вот так верно...
Код

class A()
{
A( const A& p );
};

A t;
A o = t; //Вызывается copy constructor


в первом случае работает оператор присваивания...

Автор: Wowa 14.2.2005, 16:38
Т.е. в твоем коде произойдет простое копирование объекта?


А вот это сам копи-конструктор.
Код

A( const A& p );


Получается ему в качестве параметра передаем сам объект t. А почему не &t ?
Ведь в копи-конструкторе мы по идее должны принять адрес памяти, по которому располагается объект t ?
Добавлено @ 16:47
Если мы ставим знак =, как тут:
A o = t;


то это в принципе аналогично этой записи?
A* o = new A(t);

т.е. в обоих случаях мы вызываем конструктор с передачей параметра t ?

Автор: azesmcar 14.2.2005, 16:59
Цитата
Получается ему в качестве параметра передаем сам объект t. А почему не &t ?


потому что &t это адрес типа A* мы получаем ссылку типа A& (см. Различия ссылок и указателей)
Цитата
Если мы ставим знак =, как тут:то это в принципе аналогично этой записи?
A* o = new A(t);
A o = t;

Абсолютно то же самое...это как написать
string k = "AAA";
string t = k и string t (k);

Обо позволительно...оба вызывают copy constructor

Цитата
т.е. в обоих случаях мы вызываем конструктор с передачей параметра t ?

Точно так ;)

Автор: _hunter 14.2.2005, 17:00
эта запись для компилятора -- ты явно конструктор не вызываеш и на вход ему передается не объект, а ссылка на объект ( для скорости )
во втором случае:
A* o = new A();
( или что ему нужно )

Автор: Wowa 14.2.2005, 17:01
а можно тогда в этом случае передать больше одного параметра?
Цитата(Admin @ 14.2.2005, 14:38)
A o = t;


Автор: _hunter 14.2.2005, 17:04
нет.
в конструктор копирования передается только один параметр -- ссылка на копируемый объект. все остальное можно передать через этот же объект

Автор: Wowa 14.2.2005, 17:05
Цитата(_hunter @ 14.2.2005, 15:04)
нет.
в конструктор копирования передается только один параметр -- ссылка на копируемый объект. все остальное можно передать через этот же объект

Ок, а если это к примеру обычный конструктор?

Автор: _hunter 14.2.2005, 17:07
тогда без проблем.
сколько опишеш -- столько и передавать можно ( можно несколько конструкторов прописать )

Автор: Wowa 14.2.2005, 17:08
но как этим способом?
A o = t;
Если через new, то можно было бы в скобках через запятую.

Автор: _hunter 14.2.2005, 17:12
в этом варианте никак -- такой записью ты говориш, что хочеш получить копию объекта ( и зачем его заново создавать? )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)