Скопируйте конструктор, деструктор и оператор присваивания.Когда они нам не нужны? - PullRequest
5 голосов
/ 31 марта 2011

Я знаю эмпирическое правило C ++, когда вы добавляете cctor, dtor или op = в ваш класс, вам нужно добавить и два других, чтобы заставить ваш класс работать должным образом при любых обстоятельствах.

Есть ли случаи, когда вам не нужно предоставлять все три, только один или два из них?

Почему в C ++ не требуется добавлять их все, если вы добавляете один из них в свой класс?

EDIT1:

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

Единственная причина, по которой я не имею их всех, когда вы создаете полиморфный класс, добавляя виртуальный деструктор с пустым телом. Но как только вы напишите что-нибудь в теле деструктора, вам следует подумать о том, чтобы написать что-то в теле cctor, и op = тоже.

Я ищу примеры, когда вам не нужно писать все 3 метода, и вы можете опустить некоторые из них, не вызывая ошибок в вашем классе, даже если новичок использует ваш класс. :)

Ответы [ 4 ]

5 голосов
/ 31 марта 2011

Один из случаев, когда вы можете использовать деструктор без конструктора копирования или оператора присваивания, - это при разработке полиморфного класса, и в этом случае вы хотите, чтобы деструктор virtual разрешил освобождение через указатель базового класса.Эти классы часто поддерживают конструкторы копирования, чтобы облегчить идиому «виртуального клона».Однако они редко имеют операторы присваивания, так как полиморфные классы обычно выделяются в куче и на них ссылаются только через указатели, и в этом случае прямое присваивание почти всегда приводит к нарезке.

3 голосов
/ 31 марта 2011

Наблюдаемые классы (те, которые сообщают о времени своего существования другому классу) требуют всех конструкторов и деструкторов, но не op =.C ++ не требует их, потому что это было бы совершенно ненужно - мы, программисты, знаем лучше.

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

1 голос
/ 31 марта 2011

Как правило, когда вы хотите изменить права доступа или, в случае деструктора, сделать его виртуальным.Объявление частного конструктора копирования или оператора присваивания является классическим способом запрета этих операций, даже если вам не нужен деструктор;в любое время, когда вы хотите наследовать от класса, деструктор должен быть виртуальным (или защищенным);и если вы хотите запретить что-либо, кроме динамически размещаемых экземпляров, классическая идиома состоит в объявлении частного деструктора и реализации функции уничтожения, которая выполняет delete this, чтобы избавиться от объекта.

Наконец, компилятор сгенерировалверсии встроены, и вы можете объявить одну из этих функций, чтобы она не была встроенной.(В дни меньшей памяти это часто рассматривалось.)

1 голос
/ 31 марта 2011

Вы должны написать их все, если у вас есть указатели или что-то подобное в вашем классе, чтобы не было мелкой копии в cctor или op = копирования, и утечки памяти в dtor.

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

C ++ не требует их всех, потому что он пишет по умолчанию, и потому что они могут не быть необходимыми.

...