Мы рассмотрели два способа инициализации объектов: конструктор без аргументов может инициализировать поля объекта константными значениями, а конструктор, имеющий хотя бы один аргумент, может инициализировать поля значениями, переданными ему в качестве аргументов. Третий способ инициализации объекта – это использование конструктора копии – то есть использо-вание значений полей уже существующего объекта.
Конструктор копии или копирующий конструктор является конструк-тором специального вида: он воспринимает в качестве аргумента константную ссылку (const тип_класса&) или простую ссылку (тип_класса&) на объект того же класса, что и сам конструктор. Ссылка передается каждый раз, когда новый объект инициализируется значениями уже существующего. Например:
class CCoord
{
int iX, iY;
public:
//переопределяем конструктор по умолчанию
CCoord () : iX(0), iY(0){};
//конструктор с явным указанием стартовых значений полей
CCoord (int _iX, int _iY) : iX(_iX), iY(_iY){};
//конструктор копии
CCoord (const CCoord &src);
};
//определяем конструктор копии
CCoord::CCoord (const CCoord &src)
{ iX = src.iX; iY = src.iY; }
int main ()
{
CCoord coord1(7, 11); /*вызываем конструктор явно инициализирущий значения полей iX и iY*/
CCoord coord2(coord1); // конструктор копии
return 0;
}
Если вы не предусмотрели конструктор копии, компилятор автоматически генерирует конструктор копии по умолчанию. Такой конструктор создает буквальную копию объекта. Это, скорее всего, будет непригодным для объектов, содержащих указатели и ссылки, так как могут возникнуть ситуации, когда мы будем многократно удалять одну и ту же область память или же вообще не сможем ее освободить. |