Обычно вам не нужно подробно знать внутренний формат файлов Obj, поскольку они созданы для вас. Все, что вам нужно знать, - это то, что для каждого создаваемого вами класса компилятор генерирует и файл Obj, представляющий собой двоичный байт-код вашего класса, подходящий для ОС, для которой вы компилируете. Затем следующий шаг - связывание - соберет объектные файлы для всех классов, которые вам нужны для вашей программы, в один EXE или DLL (или любой другой формат для ОС, отличных от Windows). Может быть также EXE + несколько DLL, в зависимости от ваших пожеланий.
Наиболее важным является то, что вы разделяете интерфейс (объявление) и реализацию (определение) вашего класса.
Всегда помещайте в заголовочный файл объявления интерфейса только вашего класса. Ничего другого - никаких реализаций здесь. Избегайте также переменных-членов с пользовательскими типами, которые не являются указателями, потому что для них недостаточно предварительных объявлений, и вам нужно включить в заголовок другие заголовки. Если в заголовке есть элементы, то дизайн пахнет, а также замедляет процесс сборки.
Все реализации методов класса или других функций должны быть в файле CPP. Это гарантирует, что файл Obj, сгенерированный компилятором, не понадобится, если кто-то включит ваш заголовок, а вы можете включить его от других только в файлы CPP.
Но зачем? Ответ в том, что если у вас есть такое разделение, то связывание происходит быстрее, потому что каждый из ваших файлов Obj используется один раз для каждого класса. Кроме того, если вы измените свой класс, это также изменит небольшое количество других объектных файлов во время следующей сборки.
Если вы включили в заголовок, это означает, что когда компилятор генерирует файл Obj для вашего класса, он должен сначала сгенерировать файл Obj для других классов, включенных в ваш заголовок, что может потребовать снова другие файлы Obj и т. Д. Может быть даже круговая зависимость, а затем вы не можете скомпилировать! Или, если вы что-то измените в своем классе, то компилятору потребуется перегенерировать множество других файлов Obj, потому что через некоторое время они станут очень зависимыми, если вы не разделитесь.