При передаче объекта функции создается его копия (и эта копия становится параметром в функции). Создание копии означает "рождение" нового объекта. Когда выполнение функции завершается, копия аргумента (т.е. параметр) разрушается. Здесь возникает сразу два вопроса. Во-первых, вызывается ли конструктор объекта при создании копии? Во-вторых, вызывается ли деструктор объекта при разрушении копии? Ответы могут удивить вас.
Когда при вызове функции создается копия аргумента, обычный конструктор не вызывается. Вместо этого вызывается
Но когда функция завершается и разрушается копия объекта, используемая в качестве аргумента, вызывается деструктор этого объекта. Необходимость вызова деструктора связана с выходом объекта из области видимости. Именно поэтому предыдущая программа имела два обращения к деструктору. Первое произошло при выходе из области видимости параметра функции
Итак, когда объект передается функции в качестве аргумента, обычный конструктор не вызывается. Вместо него вызывается конструктор копии, который по умолчанию создает побитовую (идентичную) копию этого объекта. Но когда эта копия разрушается (обычно при выходе за пределы области видимости по завершении функции), обязательно вызывается деструктор.
Несмотря на то что объекты передаются функциям
// Демонстрация проблемы, возможной при передаче объектов функциям.
#include
#include
using namespace std;
class myclass {
int *p;
public:
myclass(int i);
~myclass();
int getval() { return *p; }
};
myclass::myclass(int i)
{
cout << "Выделение памяти, адресуемой указателем p.\n";
р = new int;
*p = i;
}
myclass::~myclass()
{
cout <<"Освобождение памяти, адресуемой указателем p.\n";
delete p;
}
// При выполнении этой функции и возникает проблема.
void display(myclass ob)
{
cout << ob.getval() << '\n';
}
int main()
{
myclass a(10);
display(a);
return 0;
}
Вот как выглядят результаты выполнения этой программы.
Выделение памяти, адресуемой указателем р.
10
Освобождение памяти, адресуемой указателем р.
Освобождение памяти, адресуемой указателем р.
Эта программа содержит принципиальную ошибку. И вот почему: при создании в функции