C ++ copy-конструктор и присваивание - PullRequest
3 голосов
/ 17 января 2012

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

Например:

class A {
public:
  const int myVar;

  A(const int var) : myVar(var) {};
  A(const A& other) : myVar(other.myVar) {};
};

Так это ужасно? Нужно ли определять оператор присваивания, но делать его закрытым? Является ли такой класс еще копируемым?

1 Ответ

3 голосов
/ 17 января 2012

Так это ужасно?
Нет, это не так.
Не все классы должны быть как копируемыми, так и назначаемыми.Вполне допустимо иметь копируемые, но не присваиваемые классы.

Является ли такой класс еще копируемым?
Да, это так.
Пока ваш класс предоставляетa public конструктор копирования, Ваш класс является копируемым.

Нужно ли определять оператор присваивания, но делать его закрытым?
Это зависит от вашего использования.
Есливаш класс должен быть назначаемым, тогда в идеале он не должен иметь члена const.

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

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

...