Вопрос о копировании объектов в C++

Jan 16, 2011 23:00


Я не программировал серьезно на C++ с третьего курса, потому разные тонкости уже подзабыл. Ни в сети, ни у Страуструпа ответа на вдруг возникший вопрос найти не могу. Вот небольшая программа:
Собственно текст )

программирование

Leave a comment

Comments 6

(The comment has been removed)

cristobal_junta January 16 2011, 20:31:57 UTC
См. апдейт этого поста с упоминанием о Return value optimization.
Оказывается, в первом случае я думал, что пишу в переменную tmp, а компилятор сделал так, что я сразу писал в переменную "b".

Reply

(The comment has been removed)

cristobal_junta January 16 2011, 20:40:26 UTC
Нет, не исправляет!
Может быть, для того, чтобы это отключить, существует специальный флаг, но я его не нашел пока.

Reply


ext_94691 January 16 2011, 20:40:51 UTC
В этой строчке заводится объект типа A, который называется b в функции main и tmp в функции FooBar. Это один и тот же объект. Для него вызывается конструктор по умолчанию (так как написано A tmp;). Память для него выделена на стеке так, что он доступен в функции main. Поэтому больше ничего делать не нужно.

В общем, расчитывать, что можно проконтролировать создание объектов через конструктор копирования -- это плохая идея. Какой-нибудь конструктор точно всегда вызовется, но вот какой -- ты не угадаешь.

Reply

cristobal_junta January 16 2011, 21:00:22 UTC
Проконтролировать создание объектов я решил уже после того, как реализовал "A(const A&)" и спрятал "A& operator = (const A&);".
Боялся, что за прошедшее время забыл сигнатуру конструктора копирования и перегрузки оператора присваивания.
Хотел убедиться, что память нигде не течет :-)

Как же был удивлен, когда увидел, что конструктор копирования не вызывается, а когда его прячешь, программа не компилируется!

Не припомню, чтобы такое поведение было лет 8-10 назад. Я тогда использовал Borland C++ 3.1 и 5.01.

Reply


Leave a comment

Up