Я не программировал серьезно на C++ с третьего курса, потому разные тонкости уже подзабыл. Ни в сети, ни у Страуструпа ответа на вдруг возникший вопрос найти не могу. Вот небольшая программа:
( Собственно текст )
См. апдейт этого поста с упоминанием о Return value optimization. Оказывается, в первом случае я думал, что пишу в переменную tmp, а компилятор сделал так, что я сразу писал в переменную "b".
В этой строчке заводится объект типа A, который называется b в функции main и tmp в функции FooBar. Это один и тот же объект. Для него вызывается конструктор по умолчанию (так как написано A tmp;). Память для него выделена на стеке так, что он доступен в функции main. Поэтому больше ничего делать не нужно.
В общем, расчитывать, что можно проконтролировать создание объектов через конструктор копирования -- это плохая идея. Какой-нибудь конструктор точно всегда вызовется, но вот какой -- ты не угадаешь.
Проконтролировать создание объектов я решил уже после того, как реализовал "A(const A&)" и спрятал "A& operator = (const A&);". Боялся, что за прошедшее время забыл сигнатуру конструктора копирования и перегрузки оператора присваивания. Хотел убедиться, что память нигде не течет :-)
Как же был удивлен, когда увидел, что конструктор копирования не вызывается, а когда его прячешь, программа не компилируется!
Не припомню, чтобы такое поведение было лет 8-10 назад. Я тогда использовал Borland C++ 3.1 и 5.01.
Comments 6
(The comment has been removed)
Оказывается, в первом случае я думал, что пишу в переменную tmp, а компилятор сделал так, что я сразу писал в переменную "b".
Reply
(The comment has been removed)
Может быть, для того, чтобы это отключить, существует специальный флаг, но я его не нашел пока.
Reply
В общем, расчитывать, что можно проконтролировать создание объектов через конструктор копирования -- это плохая идея. Какой-нибудь конструктор точно всегда вызовется, но вот какой -- ты не угадаешь.
Reply
Боялся, что за прошедшее время забыл сигнатуру конструктора копирования и перегрузки оператора присваивания.
Хотел убедиться, что память нигде не течет :-)
Как же был удивлен, когда увидел, что конструктор копирования не вызывается, а когда его прячешь, программа не компилируется!
Не припомню, чтобы такое поведение было лет 8-10 назад. Я тогда использовал Borland C++ 3.1 и 5.01.
Reply
Leave a comment