Ваш класс содержит члены, которые не могут быть созданы или назначены по умолчанию, а именно:
Поэтому для вашего класса нельзя подразумевать конструктор по умолчанию или оператор присваивания. Например, вы должны написать свой собственный конструктор:
class Foo
{
const int a;
int & b;
public:
Foo(int val, int & modify_me) :
a(val) , // initialize the constant
b(modify_me) // bind the reference
{ }
};
Понятно, что вы не можете создать конструкцию по умолчанию Foo
(т.е. Foo x;
). Также ясно, что вы не можете переназначать объекты класса Foo
(т.е. x = y;
), потому что вы не можете переназначить ссылки или константы.
Давая вашему классу ссылку или константный член, вы фактически присваиваете ссылку или постоянную семантику самому классу, если хотите, поэтому это должно быть довольно непосредственным логическим следствием. Например, переназначение, вероятно, даже не имеет смысла семантически, потому что ваш класс должен воплощать постоянную концепцию.
Однако обратите внимание, что вы можете сделать копий вашего класса: это потому, что вы можете делать "копии" ссылок (то есть псевдонимов) и копий констант. Следовательно, конструктор копирования доступен неявно, просто применяя член-конструктор копирования. Таким образом, вы можете сказать:
int n;
Foo x(15, n);
Foo y(x);
Foo z = x; // these two are identical!
Это приводит к двум другим объектам y
и z
, которые имеют y.a == 15
и z.a == 15
, а y.b
и z.b
- все ссылки на n
. (Не смущайтесь двумя альтернативными синтаксисами в конце; оба вызывают конструктор копирования.)