Я думаю, что основной причиной инициализации вне блока class
является возможность инициализации с возвращаемыми значениями других функций-членов класса. Если вы хотите выполнить инициализацию a::var
с помощью b::some_static_fn()
, вам нужно убедиться, что каждый файл .cpp
, который включает a.h
, включает b.h
в первую очередь. Это будет беспорядок, особенно когда (рано или поздно) вы столкнетесь с круговой ссылкой, которую вы могли бы разрешить только с ненужным interface
. Эта же проблема является основной причиной для реализации функций-членов класса в файле .cpp
вместо того, чтобы помещать все в ваш основной класс .h
.
По крайней мере, с функциями-членами у вас есть возможность реализовать их в заголовке. С переменными вы должны выполнить инициализацию в файле .cpp. Я не совсем согласен с этим ограничением, и я не думаю, что для этого есть веская причина.