c ++ оператор копирования и присваивания по умолчанию - PullRequest
2 голосов
/ 21 февраля 2012

у меня есть класс

class Circle : public isCircle{
   private :
   int x;
   int y;
   vector<Circle*> _neighbors;
}

где isCircle - это просто интерфейс (с виртуальными методами), и круги, в которых _neighbors содержит указатели, не были выделены этим экземпляром. мой вопрос, если в этом случае оператор копирования и присваивания по умолчанию будет в основном делать глубокое копирование?

Ответы [ 2 ]

9 голосов
/ 21 февраля 2012

Конструктор копирования по умолчанию для типа C ++ работает, вызывая конструктор копирования для каждого поля в экземпляре с соответствующим полем в объекте, из которого создается копия. В вашем примере это примерно переводится как

Circle(const Circle& other) :
  x(other.x),
  y(other.y),
  _neighobrs(other._neighbors) {

}

Является ли копия глубокой или нет - это деталь реализации конструктора копирования каждого поля. В этом случае конструктор копирования vector<T> представляет собой смесь. Он будет глубоко копировать базовое хранилище, так что каждый vector<T> имеет свой собственный независимый массив. Однако он будет копировать элементы, используя конструктор копирования. В данном случае это тип указателя, поэтому они копируются поверхностно

0 голосов
/ 21 февраля 2012

Сгенерированные по умолчанию конструкторы копирования и операторы присваивания делают мелкие копии.

Если вы делитесь указателями между экземплярами этого класса, я предлагаю вместо вектора указателей иметь вектор умных указателей..

...