2012-01-17 3 views
3

Я много раз его размалывал в голове, что если предоставляется конструктор-копия, также должен быть предоставлен оператор присваивания. Однако бывают случаи, когда класс может использовать экземпляр-конструктор, но не оператор присваивания.C++ copy-constructor и назначение

Например:

class A { 
public: 
    const int myVar; 

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

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

+0

Этот класс даже не нуждается в явном конструкторе копирования, поскольку созданный компилятор делает именно то, что вы хотите. –

+0

@ R.MartinhoFernandes: Я предполагаю, что это упрощенный пример кода, предоставленный для выражения проблемы. –

ответ

3

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

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

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

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

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

+0

Его не нужно назначать, но он должен быть доступен для копирования. Но я привык к тому, что мне всегда говорят, есть ли у него конструктор-копия, а также * должен иметь оператор присваивания, но здесь это не имеет смысла. – tpg2114

+0

@ tpg2114: Это ** Правило трех ** в 'C++ 03' или ** Правило 5 ** в' C++ 11', на которое вы ссылаетесь здесь. Но это правило истинно в большинстве case.It не является условием, установленным стандартом (хотя это помогло бы, если бы стандарт сделал это). Классы могут быть копируемыми, но не назначаемыми, и это нормально разорвать руководство в суде. –

+2

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

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