Russian Qt Forum
Ноябрь 24, 2024, 00:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: параметр конструктора  (Прочитано 11110 раз)
blood_shadow
Гость
« : Январь 08, 2011, 21:41 »

Всем добрый вечер,

Почему работает данный код:
Код:
class Cell : QTableWidgetItem
{

public:
    Cell();
    QTableWidgetItem* clone() const;

};

Cell::Cell()
{
    cout << "In Cell Constr" << endl;
}

QTableWidgetItem* Cell::clone() const
{
    return new Cell(*this);
}

а именно почему мы можем передать конструктору параметр *this в передпоследней строке если у него нет параметров?
Записан
alexman
Гость
« Ответ #1 : Январь 08, 2011, 21:43 »

Так конструктор копирования всегда есть по умолчанию.
Записан
Fat-Zer
Гость
« Ответ #2 : Январь 08, 2011, 21:48 »

Если хотите запретить надо сделать его закрытым...
Записан
blood_shadow
Гость
« Ответ #3 : Январь 08, 2011, 22:05 »

Так конструктор копирования всегда есть по умолчанию.
а понял, все время забываю о конструкторе копирования  Улыбающийся
этот фрагмент я выдрал с книги Саммерфильда и Бланшета, тогда еще такой вопрос
зачем копировать если можно допустим просто создавать объект или эт будет быстрее?
Записан
alexman
Гость
« Ответ #4 : Январь 08, 2011, 22:09 »

Вопрос непонятен. Лучше почитай где используется конструктор копирования.
Записан
blood_shadow
Гость
« Ответ #5 : Январь 08, 2011, 23:11 »

Вопрос непонятен. Лучше почитай где используется конструктор копирования.
все разобрался...
остался вопрос по поводу записи:
Код:
return new Cell(*this);
тут вызывается конструктор копирования который делает побитовую копию, которую оператор new размещает в куче, а ретурн просто возращает указатель на этот объект в куче.
Я правильно мыслю?
Записан
Fat-Zer
Гость
« Ответ #6 : Январь 08, 2011, 23:17 »

да... только не "побитовою"
Записан
blood_shadow
Гость
« Ответ #7 : Январь 08, 2011, 23:27 »

да... только не "побитовою"
а какой? вроде же конструктор копирование делает побитовую копию, это я прочитал в книге Шилдта, там написано:
"По  умолчанию, если один объект инициализируется другим, создается побитовая копия присваиваемого объекта"
значит если это верно то и в куче должна появиться побитовая копия объекта
Записан
alexman
Гость
« Ответ #8 : Январь 09, 2011, 00:23 »

да... только не "побитовою"
а какой? вроде же конструктор копирование делает побитовую копию, это я прочитал в книге Шилдта, там написано:
"По  умолчанию, если один объект инициализируется другим, создается побитовая копия присваиваемого объекта"
значит если это верно то и в куче должна появиться побитовая копия объекта
Все правильно!
Записан
Fat-Zer
Гость
« Ответ #9 : Январь 09, 2011, 00:25 »

имел в виду, что реально не копируется каждый бит по отдельности... в лучшем случае побайтовую, а скорей всего всё будет делаться одной/двумя инструкциями. просто правильнее было бы сказать точную копию. не перите в голову. просто не понравилось слово Подмигивающий

да, brankovic прав. моя ошибка.
« Последнее редактирование: Январь 09, 2011, 01:53 от Fat-Zer » Записан
brankovic
Гость
« Ответ #10 : Январь 09, 2011, 01:33 »

"По  умолчанию, если один объект инициализируется другим, создается побитовая копия присваиваемого объекта"

Это полная ерунда. На самом деле:

struct X
{
   int i;
   char ch;
   std::string s;
};

конструктор копирования X вызовет конструктор копирования для каждого элемента. Для i и ch это, конечно, побитовая копия, но для s это вызов конструктора std::string, с маллоками, копированием байт и т.д.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #11 : Январь 09, 2011, 08:38 »

"Философия С++. Введение в стандарт", Брюс Эккель, глава 11, стр. 344
Цитировать
Чтобы создать копирующий конструктор для класса, использующего композицию (а также наследование - глава 14), компилятор рекурсивно вызывает копирующие конструкторы всех объектов класса и базовых классов.
Там же, в этой главе, примеры, доказывающие это. В вашем случае blood_shadow , с классом Cell, вывозится коп. конст. для QTableWidgetItem. Смотрим асистент
Цитировать
QTableWidgetItem::QTableWidgetItem ( const QTableWidgetItem & other )
Constructs a copy of other. Note that type() and tableWidget() are not copied.
Попробуйте проверить. Создайте класс Cell, задайте type и tableWidget. создайте копию и посмотрите у копии type и tableWidget. Если у Cell был поразрядный конструктор, то type и tableWidget должны сохранится.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Январь 09, 2011, 09:11 »

имел в виду, что реально не копируется каждый бит по отдельности... в лучшем случае побайтовую, а скорей всего всё будет делаться одной/двумя инструкциями. просто правильнее было бы сказать точную копию. не перите в голову. просто не понравилось слово Подмигивающий
Никакого "копирования памяти" не происходит. Default конструктор копирования вызывает конструкторы копирования для всех членов. В ассемблере это обычно большой кусок кода. "Точная копия" гарантируется только для POD структур.

Кароче читайте книжки и учите С++  Подмигивающий
 Улыбающийся

Edit: пардон, просмотрел: brankovic уже ответил
« Последнее редактирование: Январь 09, 2011, 09:14 от Igors » Записан
blood_shadow
Гость
« Ответ #13 : Январь 09, 2011, 12:35 »

Цитировать
Попробуйте проверить. Создайте класс Cell, задайте type и tableWidget. создайте копию и посмотрите у копии type и tableWidget. Если у Cell был поразрядный конструктор, то type и tableWidget должны сохранится.
это не из-за того, тут и так понятно что ф-ции не копируются более того ф-ции существуют еще до создания любых объектов, вот здесь более-менее норм описаны процессы - http://www.devdoc.ru/index.php/content/view/virtual_base.htm
думаю автор книги имел ввиду правило про данные, хотя как оказалось с постов выше это и для данных-объектов неверно
« Последнее редактирование: Январь 09, 2011, 18:13 от blood_shadow » Записан
blood_shadow
Гость
« Ответ #14 : Январь 09, 2011, 12:56 »

конструктор копирования X вызовет конструктор копирования для каждого элемента. Для i и ch это, конечно, побитовая копия, но для s это вызов конструктора std::string, с маллоками, копированием байт и т.д.

в этой записи:
Код:
return new Cell(*this);

тут сразу новый(скопированный объект конструктором копирования) появляется в куче? или еще раз копируются в кучу потом после создания копии?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.139 секунд. Запросов: 23.