Это потому, что у Grades есть конструктор с одним аргументом, который действует как конструктор преобразования.Такой конструктор принимает аргумент int и создает объект типа Grades.
Поэтому компиляция выполнена успешно.
Сделайте явный конструктор класса '
explicit Grades(int numExams);
Это запретит
Grades g = 2;
, но разрешит все следующие действия
Grades g = Grades(2) // direct initialization
Grades g = (Grades)2; // cast
Grades g = static_cast<Grades>(2);
Grades g(2); // direct initialization.