Funções de entrada usam buffer e o modo como elas manipulam o buffer pode trazer alguns transtornos quando precisamos ler mais de uma entrada. A maioria das funções de entrada deixam resquício no buffer, ou seja, extraem o conteúdo e deixam o ENTER no final do buffer.
Então a próxima função de entrada percebendo que já existe o caracter ENTER aceita imediatamente este buffer vazio como entrada, ou seja, como o usuário já estivesse apertado ENTER sem digitar nada.
Solução Use a função cin.ignore() logo após o uso de uma função de entrada. Ela irá limpar esse ENTER ('\n') que ficou no buffer e a próxima instrução de entrada irá funcionar normalmente.
Nota No Visual Studio, use std::cin.ignore()