Они также полезны, когда Вам нужны несколько "конструкторов" с тем же типом параметра, но с различным поведением.
Эта проблема не имеет ничего общего с внутренними классами. В C ++ вы просто не можете (повторно) назначать ссылки - они должны быть инициализированы при определении.
Более простой пример:
class B
{
public:
B(int& i) : ir(i) {};
int& ir;
};
int main()
{
int i;
B b(i); // Constructor - OK
int j;
B bb = B(j); // Copy constructor - OK
bb = b; // Assignment - Error
return 0;
}
Ссылка не может быть изменена после того, как ей присвоено начальное значение. Это означает, что невозможно написать оператор присваивания, который изменяет значение ссылочного члена. Если вам нужно это сделать, используйте указатель вместо ссылки.
В C ++ нет «внутренних классов», только объявления вложенных классов. «внутренние классы» - это Java-ism, который, я не думаю, можно найти в других основных языках. В Java внутренние классы особенные, потому что они содержат неявную неизменяемую ссылку на объект содержащего типа. Для достижения эквивалента вложенным объявлениям C ++ в Java требуется использование статических внутренних классов; статические внутренние классы не содержат ссылки на объект объявляющего типа.
На самом деле, есть решение этой проблемы. Вы можете реализовать operator = в терминах конструкции копирования , и он будет работать :) Это очень эффективный метод для таких случаев. Предполагая, что вы действительно хотите поддержать назначение.