myclass(int i); // обычный конструктор
myclass(const myclass &ob); // конструктор копии
~myclass();
int getval() { return *p; }
};
// Конструктор копии.
myclass::myclass(const myclass &obj)
{
p = new int;
*p = *obj.p; // значение копии
cout << "Вызван конструктор копии.\n";
}
// Обычный конструктор.
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
Освобождение памяти, адресуемой указателем р.
Освобождение памяти, адресуемой указателем р.
При выполнении этой программы здесь происходит следующее: когда в функции
По завершении функции
Конструктор копии также вызывается в случае, когда один объект используется для инициализации другого.
Рассмотрим следующую простую программу.
// Вызов конструктора копии для инициализации объекта.
#include
#include
using namespace std;
class myclass {
int *p;
public:
myclass(int i); // обычный конструктор
myclass(const myclass &ob); // конструктор копии
~myclass();
int getval() { return *p; }
};
// Конструктор копии.
myclass::myclass(const myclass &ob)
{
p = new int;
*p = *ob.p; // значение копии
cout << "Выделение p-памяти конструктором копии.\n";
}
// Обычный конструктор.
myclass::myclass(int i)
{
cout << "Выделение p-памяти обычным конструктором.\n";
р = new int;
*р = i;
}
myclass::~myclass()
{
cout << "Освобождение р-памяти.\n";
delete p;
}
int main()
{
myclass a(10); // Вызывается обычный конструктор.
myclass b = a; // Вызывается конструктор копии.
return 0;
}
Результаты выполнения этой программы таковы.
Выделение p-памяти обычным конструктором.
Выделение p-памяти конструктором копии.
Освобождение р-памяти.