Когда программы становятся большими, очень хочется, чтобы при изменении одного куска не ломалось все остальное. Для этого программы разбиваются на части, взаимодействующие через некоторые интерфейсы. Чем этих связей меньше, тем проще поддерживать такой код.
Переменная(private) в классе лучше глобальной тем, что доступ к ней имеет только сам класс. В таком случае я могу при написании класса рассчитывать, что свои данные меняю только я, поэтому в каждый момент времени они непротиворечивы. Например класс Square описывает квадрат, у которого мы хотим задавать длину стороны и спрашивать его площадь.
class Square
{
void setSide(double side)
{
side_ = side;
area_ = side * side;
}
double getSide()
{
return side_;
}
double getArea()
{
return area_;
}
private:
double side_;
double area_;
}
В процедурном варианте кто-то может изменить длину стороны и забыть (сам дурак, но если параметров не два а несколько десятков, помнить о всех закономерностях затруднительно) изменить площадь, в таком случае, он начнет получать неправильные результаты.
Еще прочитайте про наследование, оно используется очень часто.
Про enum можно не забивать голову пока.