C/C++ Урок 43. Конструктор копирования
Конструктор C++ при копировании одного объекта в другой работает поэлементно. То есть в переменные экземпляра класса, в который производится копирование, копируются значения из соответствующих переменных экземпляра класса, который копируется. Чаще всего нам именно такое поведение и надо - но не всегда. Например, если у нас в классе есть указатель на экземпляр другого класса, то при таком способе копируется именно указатель, т. е. в двух копиях нашего класса указатель будет указывать на одну и ту же область памяти - что нам, скорей всего, не нужно. Для того, чтобы избежать это, мы долны написать для нашего класса конструктор копирования, в котором и определить способ копирования одного экземпляра нашего класса в другой.
Вот пример класса с конструктором копирования:
#include <iostream.h>
class B{
public:
int k;
B(){
k = 0;
}
};
class SomeClass{
public:
B *b;
SomeClass(){
b = new B;
}
// Конструктор копирования.
SomeClass(const SomeClass & w){
this->b = new B;
this->b->k = w.b->k;
}
};
void main(){
SomeClass q;
SomeClass q1 = q; // Вызов конструтора копирования.
q1.b->k = 3;
cout << q.b->k;
}
Ситуация тут такая - в классе SomeClass есть указатель на класс B. В main мы создаем два экземпляра нашего класса SomeClass, и копируем один экземпяр в другой. Но при нашем копировании указатель на класс B не будет напрямую копироваться (т. е. адреса указателей на B у разных экземпляров класса SomeClass будут разные). И, как следствие, поменяв значение экземпляра класса B в одном экземляре класса SomeClass (в нашем случае q1) мы не поменяем значение экземпляра класса B в другом экземпляре класса SomeClass (в экземпляре q).
Таким образом наша программа выведет 0. А без определения конструктора копирования она бы вывела 3.
|