Объектно-ориентированное программирование - это метод программирования, способ написания
«хороших» программ для множества задач. Если этот термин имеет какой-то смысл, то он должен
подразумевать: такой язык программирования, который предоставляет хорошие возможности для
объектно-ориентированного стиля программирования.
Здесь следует указать на важные различия. Говорят, что язык поддерживает некоторый стиль
программирования, если в нем есть такие возможности, которые делают программирование в этом
стиле удобным (достаточно простым, надежным и эффективным). Язык не поддерживает некоторый
стиль программирования, если требуются большие усилия или даже искусство, чтобы написать
программу в этом стиле. Однако это не означает, что язык запрещает писать программы в этом стиле.
Действительно, можно писать структурные программы на Фортране и объектно-ориентированные
программы на С, но это будет пустой тратой сил, поскольку данные языки не поддерживают указанных
стилей программирования.
Фраза `способ написания «хороших» программ` звучит немного глупо, но книга, из которой выдран этот абзац, была издана в 1986 году, поэтому можно просто не заострять внимание на этом моменте. А в остальном со всем согласен. Рекомендую прочитать продолжение этого текста тем, кто не читал книгу «Язык программирования С++» (глава 1.2 Парадигмы программирования).
Я бы сказал так: ключевым отличием ООП является возможность создавать пользовательские типы на основе других типов таким образом, что функция, правильно работающая с объектами, принадлежащими к родительскому типу гарантированно продолжит правильно работать также и с объектами дочернего типа.
ключевым отличием ООП является возможность создавать пользовательские типы на основе других типов таким образом, что функция, правильно работающая с объектами, принадлежащими к родительскому типу гарантированно продолжит правильно работать также и с объектами дочернего типа.
Это называется subtyping, и к ООП это имеет довольно посредственное отношение.
Думаю, что это определение структуры автором было выбрано не спроста. Очевидно, что таким образом оно становится кратким и доходчивым. Не важно кто после кого появился. Да, структура это класс, а класс это структура. Просто есть доп. условия.
In object-oriented programming, a class is an extensible program-code-template for creating objects. Тыкаем на objects. An object can be a variable, a data structure, or a function
Отношусь к ООП, как к методу проектирования (ага, вот эти квадратики от руки на бумажке и стрелочки между ними). ООП код - код, оперирующий абстракциями, описанными в проекте. ООП язык - язык, в который заложены наиболее часто используемые абстракции на уровне синтаксиса. Не дрочу на Ъ-реализации ООП, может быть они и правильные с академической точки зрения, но когда прочитал у кого-то (Брукс?) как индустрия докатилась до ООП, то забил на Ъ.
Это значит, что к этим данным может напрямую обращаться кто угодно. В классе же немного по-другому: если эти данные помечены как не публичные, то кто угодно обратиться к ним не может. Есть, как вы сказали, «белый список», который возглавляет сам класс. Если углубляться, то этот список может быть расширен друзьями класса, наследниками класса в зависимости от уровня доступа. Для понимания снова приведу пример, что был выше. есть класс и структура: class ManClass{int health, Sex sex, kick()}, struct ManStruct {int health, Sex sex}. У каждого есть 2 переменные: здоровье и пол. Так же есть общедоступный (несокрытый от кого-либо) метод kick() у ManClass. Создадим 2 экземпляра: ManClass manC, ManStruct manS. Допустим, мы проинициализировали их здоровье значением 100. Теперь попробуем отнять у каждого из них по 10 здоровья. manS.health -= 10 выполнится в штатном режиме, а вот manС.health -= 10 вызовет ошибку компиляции: вы не имеете права из вне редактировать поля класса. В общем случае доступ к manС.health в данной ситуации можно осуществить через метод ManClass::kick. Метод принадлежит классу, значит он имеет доступ к ManClass::health. Значит в нём можно прописать health -= 10, а уже извне попросим manС.kick().