Wszystko wynika z charakteru obsługi standardowego wejścia.
Strumienie nie operują bezpośrednio na klawiaturze - każdy program ma swój bufor wejściowy, do którego trafiają znaki, wpisane z klawiatury. Dopiero stamtąd je odczytujesz przy pomocy strumienia. Wszystko, co powciskasz na klawiaturze - nawet kiedy program nie czeka na dane wejściowe - trafia tak czy siak do bufora i tam zostaje, dopóki tego nie wyjmiesz.
Dlatego praca ze strumieniem jest kłopotliwa - przynajmniej taka praca, która zapewnia niezawodne działanie.
Kiedy wpisujesz jakąś liczbę i zatwierdzasz enterem, do bufora trafia i liczba, i znak końca linii. Operator >> ignoruje nam ten znak, natomiast funkcja getchar() już nie.
Jeśli zależy Ci na tym, żeby użyć getchar() (równie dobrze możesz użyć operatora >>), musisz przed jej użyciem wyczyścić strumień z niepożądanych znaków.
Funkcja czyszcząca bufor może wyglądać tak:
#include <iostream>
#include <limits>
void clear_cin_buffer()
{
std::cin.clear(); // wyczyszczenie ewentualnych flag błędów
std::cin.ignore(std::numeric_limits <std::streamsize>::max(), '\n'); // zignorowanie zawartości bufora, aż do znaku nowej linii
}
Natomiast nie powinieneś raczej używać funkcji getch(), gdyż jest nieprzenośna.