Почему после определения класса ставится точка с запятой, а после определения функции — нет?
Потому что по сути, объвление класса - это объявление переменно (я не совсем правильно выражаюсь, но допустим).
А в с++, когда пишут int a;
ставят точку с запятой.
точно так же:class Foo 
{
int a_;
} foo;
только име переменно писать не обязательно.
Суть приблизительно такая.
определение функции всегда заканчивается после символа }, а определение класса - не всегда.