Sobre quando usar:
Métodos estáticos: Quase nunca. Geralmente são usados para métodos fábrica (que usam o construtor de alguma forma específica para construir objetos da própria classe) ou método utilitários (sendo que nesse caso, deve-se pensar bem se não seria melhor usar um método de instância);
Métodos de instância: Quase sempre.
Sua analogia está certa. Um método estático é como se fosse uma função simples em C, fazendo a classe se comportar como se fosse um “namespace”.
Agora, o método de instância é o seguinte. Imagine que em C você tenha uma Struct qualquer:
typedef struct {
float raio;
} Circulo;
Você provavelmente teria vários funções assim:
float perimetro(Circulo &circulo);
float raio(Circulo &circulo);
Que você usava assim:
Circulo circulo;
circulo.raio = 10;
printf("A area do circulo eh %.2f", area(circulo));
E o uso dessa forma é algo muito comum. Qual foi a idéia então? Que tal se essas funções estivessem na própria struct, e atuassem sobre ela? Te pouparia do trabalho de passar como parâmetro a struct:
typedef struct {
float raio;
float perimetro(); //calcula o perímetro dessa struct
float raio(); //calcula o raio dessa struct
} Circulo;
Exemplo:
Circulo circulo;
circulo.raio = 10;
printf("A area do circulo eh %.2f", circulo.area());
Com objetos é a mesma coisa. Mas isso foi apenas o ponto de partida para um paradigma inteiramente novo. Muda não só a posição das funções, mas a forma de pensar no problema. Com o tempo, você estudará outros recursos, como o polimorfismo, e vai ver que essa aproximação do método e do dado é muito mais poderosa do que parece.