2013-10-26 4 views
2

Нужно ли нам писать только конструктор и оператор присваивания, когда у нас есть элементы данных указателя (поскольку в противном случае два указателя могли бы указывать на один и тот же объект, когда сгенерированная компилятором копия ctor выполняет мелкую копию)?Когда указать пользовательский конструктор копирования и оператор присваивания?

Если все наши элементы данных распределены в стеке, мы можем просто полагаться на компилятор-конструктор копирования и оператор присваивания?

+1

Обратите внимание на * Правило трех *.Полезно знать, что если вы приобретаете какой-либо ресурс и вам нужно распоряжаться или очищать, вам, вероятно, необходимо определить три операции (четыре в C++ 11 для решения семантики перемещения): http: // stackoverflow. ком/вопросы/4172722/что-это-на-верховенство три – Escualo

ответ

1

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

Только если вам нужна копия данных, вы должны исправить конструктор копирования.

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

4

Указатели - это, несомненно, самый очевидный случай, но не единственный.

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

0

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

Для случая потока, этот конструктор копирования, возможно, придется

а) дублировать файл,

б) создать новый пустой файл, который может быть записан,

с) или сохранить адрес потока, чтобы оба объекта могли писать на него.

Последний вариант является самым сложным и, вероятно, потребует использования shared_ptr.

0

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

Что не так очевидно, так это то, что некоторым классам, не поддерживающим ресурсы напрямую, может потребоваться назначение копии: если вы хотите, чтобы ваше назначение копии было строго безопасным, вам часто необходимо реализовать назначение копии. Например, предположим, что ваш класс хранит два вектора. Сгенерированное сжатие копии выполняет членское присвоение. Обычно присваивание по порядку равномерно. Однако, если приступ второго вектора выдает исключение, восстановить исходное состояние невозможно! Лучше копия assgnment будет выглядеть так:

T& T::operator= (T other) { 
    other. swap(*this); 
    return *this; 
} 

С swap() может быть реализован без метания, Это imolementation сильно исключения безопасного.

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