Ты конечно можешь написать один огроменный файл main.cpp... Но во-первых, как ты будешь с ним работать? Файл из пары миллионов строк - такое себе дело. Во-вторых, любое изменение любой функции приведет к повторной компиляции всего огромного файлища. В то время как изменение функции в отдельном файле требует повторной компиляции только этого отдельного файла.
В других файлах cpp помимо того в котором находится функция main, находятся определения класса. А в заголовочных файлах (файлы с расширением *.h) - объявления класса (или объявления прототипов функций и объявленные переменные класса). Делается чтобы упростить структуру программы и сделать её более пригодной для модификации и расширения функциональности или утилизации.
Смотри по тегу "модульность" Как вариант (один из многих!!!!) - скорость сборки большого проекта после единичного изменения в коде - в случае модульной архитектуры - сильно возрастает: нужно просто пересобрать один модуль и перелинковать экзешники. Вместо полной пересборки в случае монолитного файла с исхоным текстом.