Программирование. Принципы и практика использования C++ Исправленное издание, стр. 239
double* elem; // указатель на элементыpublic: vector(int s) // конструктор :sz(s), elem(new double[s]) { /* */ } // выделяет // память ~vector() // деструктор { delete[ ] elem; } // освобождает // память // ...};Попробуем скопировать один из таких векторов.
void f(int n){ vector v(3); // определяем вектор из трех элементов v.set(2,2.2); // устанавливаем v[2] равным 2.2 vector v2 = v; // что здесь происходит? // ...}Теоретически объект
v2vi[0:v.size()]v2.size()==v.size()v2[i]==v[i]f()vectorvectorvectorПо умолчанию копирование относительно класса означает “скопировать все данные-члены”. Это часто имеет смысл. Например, мы копируем объект класса
Pointv.sz==v2.szv.elem==v2.elem
Иначе говоря, объект
v2vvv.set(1,99); // устанавливаем v[1] равным 99v2.set(0,88); // устанавливаем v2[0] равным 88cout << v.get(0) << ' ' << v2.get(1);В результате мы получили бы вектор
8899vv200v[0]v2[1]vectorf()vv2vdelete[] elem;И то же самое сделает деструктор объекта
v2vv2elem18.2.1. Конструкторы копирования
Итак, что делать? Это очевидно: необходимо предусмотреть операцию копирования, которая копировала бы элементы и вызывалась при инициализации одного вектора другим. Следовательно, нам нужен конструктор, создающий копии. Такой конструктор, очевидно, называется копирующим (copy constructor). В качестве аргумента он принимает ссылку на объект, который подлежит копированию. Значит, класс
vectorvector(const vector&);Этот конструктор будет вызываться, когда мы попытаемся инициализировать один объект класса
vectorconstvectorclass vector { int sz; double* elem; void copy(const vector& arg); // копирует элементы copy // из arg в *elempublic: vector(const vector&); // конструктор копирования // ...};Функция-член
copy()void vector::copy(const vector& arg) // копирует элементы [0:arg.sz–1]{ for (int i = 0; i<arg.sz; ++i) elem[i] = arg.elem[i];