Почему нельзя обойтись без прототипа метода в классе? С++
У нас есть определение класса Point. И я хочу объявить не в теле этого класса некоторый метод:
void Point::set(int x, int y)
{
/*здесь код*/
}
Для чего в классе Point я должен буду прописать прототип этого метода, разве то, что я пишу Point:: не говорит компилятору о том, что у данного класса есть такой метод?
Ответы (2 шт):
Point:: - это называется поиск имени с квалификатором (qualified name lookup) и говорит о том, что объявление символа, имя которого идет после ::, следует искать в Point. О том, что в у данного класса есть такой метод и какая у него сигнатура, компилятору говорит объявление метода в теле класса.
Класс считается завершенным (complete), когда его определение закончено. Собственно добавление метода во вне определения класса не может работать в С++ по многим причинам. Хотя бы потому, что для этого нет синтаксиса модификатора доступа, или например static имеет иной смысл вне определения класса.
Виртуальные функции по понятным причинам должны быть все объявлены в одном месте.
Специальные члены классов (копирующие и перемещающие конструкторы и операторы присваивания, и деструкторы) - может и могли бы быть объявлены отдельно, но это создавало бы большую путаницу.
Для остальных функций есть как минимум еще одна проблема - что делать с непубличными полями/методами? Открывать к ним доступ для объявленных позднее методов? Тогда смысл теряется.
Если не учитывать последнее, то невозможность добавлять обычные функции в классы - это произвольное ограничение. Но это в чем-то удобно: если пишешь foo.bar(), то можешь быть уверенным, что это метод из оригинального класса, а не дописанный кем-то снаружи.
Были поползновения в похожую сторону - не разрешить дописывать функции в класс, но сделать синтаксис f(a,x,y), a.f(x,y) и a->f(x,y) более-менее взаимозаменямым. Но в стандарт это не приняли.