Повідомлення про помилку чітко говорить про те, що конструктор за замовчуванням видалено неявно . Це навіть говорить чому: клас містить нестатичну змінну const, яка не була б ініціалізована ctor за замовчуванням.
class X {
const int x;
};
Так як X::x
це const
, він повинен буде почати - але по замовчуванням не т е р зазвичай форматувати його (бо це тип POD). Тому, щоб отримати ctor за замовчуванням, потрібно визначити його самостійно (і він повинен ініціалізуватися x
). Ви можете отримати таку ж ситуацію з членом, що є довідкою:
class X {
whatever &x;
};
Напевно, варто відзначити, що обидва вони також відключать неявне створення оператора присвоєння, по суті, з тієї ж причини. Оператор неявного присвоєння зазвичай виконує призначення членів, але з членом const або референтним членом він не може цього зробити, оскільки член не може бути призначений. Щоб виконати завдання, потрібно написати власного оператора присвоєння.
Ось чому const
член, як правило, повинен стати статичним - коли ви робите завдання, ви не можете призначити члена const. У типовому випадку всі ваші екземпляри матимуть однакове значення, тому вони можуть також мати доступ до однієї змінної замість того, щоб мати багато копій змінної, які будуть мати однакове значення.
Звичайно, можна створити екземпляри з різними значеннями, хоча ви (наприклад) передаєте значення під час створення об'єкта, тому два різних об'єкти можуть мати два різних значення. Якщо ж ви спробуєте зробити щось подібне до їх заміни, член const збереже своє первісне значення замість того, щоб заміняти їх.