Объект должен копировать только то, что ему нужно скопировать.Хотя этот вопрос помечен как независимый от языка, и вы упомянули C ++, я предпочитаю объяснять в терминах C # (поскольку это то, с чем я больше всего знаком).Однако концепции похожи.
Типы значений похожи на структуры.Они живут прямо в экземпляре объекта.Поэтому, когда вы копируете объект, у вас нет выбора, кроме как скопировать тип значения.Таким образом, вам, как правило, не нужно беспокоиться об этом.
Типы ссылок похожи на указатели, и здесь все становится сложно.В зависимости от типа ссылки, вы можете или не можете хотеть глубокую копию.Общее правило заключается в том, что если ссылочный тип (как элемент объекта) зависит от состояния внешнего объекта, его следует клонировать.Если нет, и никогда не будет, это не должно быть.
Другой способ мышления состоит в том, что объект, переданный вашему объекту извне, вероятно, НЕ должен быть клонирован.Объект, сгенерированный вашим классом, должен быть.
Хорошо, я соврал, я буду использовать немного C ++, так как это лучше всего объяснит, что я имею в виду.
class MyClass {
int foo;
char * bar;
char * baz;
public: MyClass(int f, char * str) {
this->foo = f;
bar = new char[f];
this->baz = str;
}
};
С этим объектом естьдва строковых буфера, с которыми нужно иметь дело.Первый, bar
, создается и управляется самим классом.Когда вы клонируете объект, вы должны выделить новый буфер. С другой стороны,
baz
не должно быть.На самом деле, вы не можете, так как у вас недостаточно информации для этого.Указатель должен быть просто скопирован.
И, конечно же, foo
- это просто число.Просто скопируйте его, больше не о чем беспокоиться:)
В итоге, чтобы ответить на ваши вопросы напрямую:
- 99% времени, нет.Есть только один способ скопировать, который имеет смысл.Однако этот способ может быть разным.
- Не напрямую.Документировать это хорошая идея, но все внутреннее должно оставаться внутренним.
- Просто "Глубокая копия".Вы не должны (Edit: ALMOST) никогда не пытаться клонировать объект или указатель, который вы не контролируете, так что это освобождается от правил:)