Когда я исследовал преимущества C над C ++, я наткнулся на этот параграф:
Стандартным способом инкапсуляции в C является предварительное объявление структуры и доступ к ее данным только через функции. Этот метод также создает инкапсуляцию времени компиляции. Инкапсуляция времени компиляции позволяет нам изменять элементы структур данных без перекомпиляции клиентского кода (другой код использует наш интерфейс). С другой стороны, стандартный способ инкапсуляции C ++ (с использованием классов) требует перекомпиляции клиентского кода при добавлении или удалении закрытых переменных-членов.
Я понимаю, как упреждающее объявление структуры и доступ к ее членам через функции скрывает детали реализации структуры. Что я не понимаю, так это в частности:
Инкапсуляция времени компиляции позволяет нам изменять элементы структур данных без перекомпиляции клиентского кода (другой код использует наш интерфейс).
В каком сценарии это применимо?
struct
это черный ящик с неизвестными внутренностями. Если клиент не знает внутренности, он никогда не сможет получить к ним доступ напрямую, и вы можете изменить их по своему желанию. Это похоже на инкапсуляцию в ООП. Внутренние компоненты являются частными, и вы можете изменить объект только с помощью открытых методов.Ответы:
Возможный сценарий реальной ситуации, когда это происходит, когда библиотека базы данных, написанная в дни, когда пространство на жестком диске было очень ограничено, использовала один байт для хранения поля даты в году (например, 11-NOV-1973 бы
73
на год). Но когда наступил 2000 год, этого уже было бы недостаточно, и тогда год должен был быть сохранен как короткое (16-разрядное) целое число. Соответствующий (очень упрощенный) заголовок для этой библиотеки может быть таким:И «клиентская» программа будет:
«Оригинальная» реализация:
Затем, при приближении 2000 года, этот файл реализации будет изменен следующим образом (все остальное остается без изменений):
Когда клиент должен быть обновлен для использования новой (безопасной для Y2K) версии, никаких изменений кода не потребуется. На самом деле, вам даже может не потребоваться повторная компиляция: может быть достаточно простой повторной ссылки на обновленную библиотеку объектов (если это так) .
источник
Примечание. Следующий список не является исчерпывающим. Изменения приветствуются!
К применимым сценариям относятся:
Наиболее известной структурой такого рода является
FILE
. Вы просто позвонитеfopen()
и получите указатель в случае успеха. Этот указатель затем передается каждой другой функции, которая работает с файлами. Но вы не знаете - и не хотите знать - детали, такие как содержащиеся элементы и размер.источник