При многопоточном использовании — std::atomic из C++11.
Насчёт качества кода лучше static. Посмотрим, что дальше (занимаюсь тут мелким эникеем и не могу пока посмотреть код).
На работу не влияет. Но using namespace крайне не рекомендуется в хедерах, за одним интересным исключением (см. хедеры C++ Builder) — весь хедер вносится в одно пространство имён, а затем using namespace.
Т.е. в двухмерном массиве каждый умный указатель владеет не одним студентом, а целым массивом. Правда, и недостаток есть у такой системы — тяжело удалять.
Если вдруг — переписывать придётся только StudentList. :)
Т.е. перед нами две вещи.
1) Вот так может выглядеть динамическая структура данных.
2) Желательно отделять структуры данных от структур реальной жизни — кроме участков, которые больно уж подогнаны по месту.
Чтобы сделать настоящий двумерный массив, придётся почти один в один скопировать то, что я написал, и приписать поддержку маленьких массивчиков.
Раз мы только учимся, мы не будем влезать в самописные шаблоны C++, готовые шаблоны STL (кроме algorithm и string) и новый, но уже реализованный во всех компиляторах стандарт C++11.