2012-02-20 2 views
2

У меня есть классс ++ по умолчанию копии и назначение оператора

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

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

+7

Глубокая копия указателей, да, но не то, на что указывают указатели. – ildjarn

+0

И не используйте имена с «_» спереди. –

+5

@DmitryKachko почему бы и нет? –

ответ

0

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

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

9

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

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

} 

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

Смежные вопросы