En los .h van la declaración de tipos y funciones que luego implementas en el .c o .cpp. Se utiliza para ser incluido en otros ficheros de cabecera o implementación que utilicen esos tipos o funciones.
De esta forma, si por ejemplo en un fichero .cpp tuyo utilizas la función printf(...), para que el compilador sepa qué tipo tiene ese símbolo "printf" que parece que estás utilizando, debes haber incluido el fichero de cabecera "stdio.h"
Existen dos formas de incluir un fichero de cabecera, entre los símbolos menor_que, mayor_que, o entre comillas. La regla "mnemotécnica" es algo así como "si los .h son tuyos, entre comillas, si no, entre ángulos", aunque la realidad es que cuando va entre comillas, el compilador busca el .h primero en el directorio donde está el fichero que lo incluye, y después en directorios adicionales (los directorios donde el compilador instala los .h de lasl ibrerías que incluye, como la del stdio).
Por último, para evitar que el fichero de cabecera se incluya dos veces en el mismo fichero de implementación, se utilzan macros.
En resumen, el "esqueleto" de un fichero de cabecera, digamos "cabecera.h" es algo así:
#ifndef CABECERA_H // Este símbolo será distinto para cada .h
#define CABECERA_H
// Tipos de datos
typedef struct {
int x;
int y;
} TPunto;
// ...
// Funciones
TPunto suma(const TPunto &a, const TPunto &b);
//...
#endif
Saludos