Все дело в том, какой код должен знать о каком другом коде. Вы хотите уменьшить количество файлов, о которых знают другие файлы, до минимума, позволяющего им выполнять свою работу.
Им нужно знать, что функция существует, какие типы им нужно передать в нее и какие типы она будет возвращать, но не то, что она делает внутри. Обратите внимание, что с точки зрения программистов также важно знать, что на самом деле означают эти типы. (например, какой int является строкой, а какой столбцом), но сам код не заботится. Вот почему целесообразно называть функцию и параметры разумным.
Как уже говорили другие, если в файле cpp нет ничего, что могло бы быть доступно другим частям кода, как это обычно происходит с main.c, тогда файл заголовка не нужен.
Иногда стоит поместить все, что вы хотите показать, в один заголовочный файл (например, Func1and2and3.h), так что все, что знает о Func1, знает и о Func2, но я лично не заинтересован в этом, так как означает, что вы склонны загружать чертовски много мусора вместе с тем, что вам действительно нужно.
Резюме:
Представьте, что вы доверяете тому, что кто-то может написать код, и что его алгоритмы, дизайн и т. Д. Все хорошо. Вы хотите использовать код, который они написали. Все, что вам нужно знать, это что им дать, чтобы что-то произошло, что вы должны дать, и что вы получите обратно. Вот что нужно сделать в заголовочных файлах.