Идея, стоящая за введением класса, может быть сформулирована следующим образом: в классе мы объединяем данные с методами по работе с ними в одном пространстве имён. Да, можно было бы обойтись без классов, понаделать структур (записей) и наштамповать функций, в которые явно передавать ту структуру, с которой мы хотим работать. Класс отличается только тем, что в него всегда неявно передаётся объект, стоящий в левой части оператора разыменовывания при вызове метода и внутри метода класса все члены класса доступны по своим именам. Кроме того, объектно-ориентированное программирование подразумевает три вещи:
- инкапсуляция (скрытие) — не все члены класса могут быть доступными, некоторые можно объявить скрытыми. Без ООП это т.н. «недокументированные функции», некоторые использовали их в своих программах, с выходом следующей версии недокументированные функции изменялись, программы прекращали работать. Когда члены класса скрыты, то программисту, использующему класс о них знать не положено, более того, вредно.
- наследование — класс может быть расширен, дополнен, видоизменён в классах-потомках. Это нужно для повторного использования кода, чтобы не писать новые функции под новые структуры данных. Без ООП нам бы пришлось для каждой структуры объявлять все их поля и функции для работы с ними заново.
- полиморфизм — изменчивость, мы имеем полное право вместо объекта одного класса передать объект производного класса и программа продолжить работать. Это позволяет работать с объектами производных классов в программах, которые могут даже не знать о существовании классов-потомков при их разработке.
Итак, с точки зрения выполнения программы классы никаких преимуществ на дают, наборот несколько замедляют, но при этом позволяют при правильной организации существенно упростить разработку, особенно больших программ. В мелких скриптах они не нужны, только мешаются и путаются.