Когда объект передается функции как аргумент, создается копия объекта. Более того, при создании этой копии конструктор объекта не вызывается. Вместо этого делается точная копия объекта. Однако по окончании выполнения функции вызывается деструктор копии объекта. Если по каким-либо причинам нежелательно, чтобы создавалась копия объекта или чтобы вызывался деструктор, то надо передать объект в функцию по ссылке. При передаче по ссылке копия объекта не создается. Это также означает, что объект-параметр не будет уничтожаться при выходе из функции и соответственно не будет вызван деструктор. В качестве примера запустим следующую программу:
#include <iostream.h>
class cl {
int id;
public:
int i;
cl (int i);
~cl ();
void neg(cl &o) {o.i = -o.i;}
};
cl::cl(int num)
{
cout << "Constructing " << num << "\n";
id = num;
}
cl::~cl()
{
cout << "Destructing " << id << "\n";
}
int main()
{
cl о (1);
o.i = 10;
о.neg (o);
cout << o.i << "\n";
return 0;
}
Программа выдает следующие результаты:
Constructing 1
-10
Destructing 1
Как можно видеть, деструктор объекта cl вызывался только один раз.
При передаче объекта в функцию по ссылке действие над объектом внутри функции модифицирует этот объект. И эти изменения сохраняют силу после завершения работы функции.