Ответ 1
ИМХО, существующие ответы дают плохую работу, объясняющую "Почему" этого - слишком много внимания, повторяя, какое поведение действительно. "Модификаторы доступа работают на уровне класса, а не на уровне объекта". - да, но почему?
Общая концепция здесь заключается в том, что программист (программисты) проектирует, пишет и поддерживает класс, который (как ожидается) понимает желаемую инкапсуляцию OO и уполномочен координировать ее реализацию. Итак, если вы пишете class X
, вы кодируете не только то, как отдельный объект X x
может использоваться кодом с доступом к нему, но также как:
- производные классы могут взаимодействовать с ним (через необязательно чистые виртуальные функции и/или защищенный доступ) и
- Различные
X
объекты сотрудничают, чтобы обеспечить предполагаемое поведение, соблюдая приложенные условия и инварианты от вашего дизайна.
Это не просто конструктор копий - большое количество операций может включать в себя два или более экземпляра вашего класса: если вы сравниваете, добавляете/умножаете/деляете, копируете, клонируете, присваиваете и т.д., то часто случай, когда вы либо просто должны иметь доступ к закрытым и/или защищенным данным в другом объекте, либо хотите, чтобы он позволял выполнять более быструю или более быструю реализацию функции.
В частности, эти операции могут использовать привилегированный доступ, чтобы делать такие вещи, как:
- (конструкторы копирования) используют частный член объекта "rhs" (правая сторона) в списке инициализации, так что переменная-член сама построена по-копированию вместо построенной по умолчанию (если она даже законна), а затем назначается слишком (опять же, если это законно)
- совместно использовать ресурсы - файлы, сегменты разделяемой памяти,
shared_ptr
для ссылки на данные и т.д. - взять на себя ответственность за вещи, например.
auto_ptr<>
"перемещает" собственность на объект, находящийся в стадии разработки. - копировать частные "кешированные", калибровочные или государственные элементы, необходимые для создания нового объекта в оптимально используемом состоянии без необходимости регенерировать их с нуля
- информация о копировании/доступе/информация о трассировке, хранящаяся в копируемом объекте, который иным образом не доступен через общедоступные API, но может использоваться каким-либо более поздним объектом исключения или протоколированием (например, что-то о времени/обстоятельствах, когда "оригинальная" копия построенный экземпляр)
- выполнить более эффективную копию некоторых данных: например, объекты могут иметь, например, a
unordered_map
, но публично выставлятьbegin()
иend()
итераторы - с прямым доступом кsize()
вы могли быreserve
емкость для более быстрого копирования; хуже, если они только выставляютat()
иinsert()
и в противном случаеthrow
.... - копировать ссылки обратно на родительские/координационные/управляющие объекты, которые могут быть неизвестны или только для записи для кода клиента.