Я узнал, что никогда не могу получить доступ к частной переменной, только с помощью функции get в классе. Но тогда почему я могу получить к нему доступ в конструкторе копирования?
Пример:
Field::Field(const Field& f)
{
pFirst = new T[f.capacity()];
pLast = pFirst + (f.pLast - f.pFirst);
pEnd = pFirst + (f.pEnd - f.pFirst);
std::copy(f.pFirst, f.pLast, pFirst);
}
Мое заявление:
private:
T *pFirst,*pLast,*pEnd;
c++
private
access-specifier
король демонов
источник
источник
const&
геттер или геттер по значению для каждого? для значений тратят ресурсы и терпят неудачу для не копируемых членов.) Я сбит с толку таким успехом такого бессмысленного вопроса, когда я спрашиваю о копирующей конструкции, полностью игнорируя, что это означает, и ни один ответ не использует базовую логику, чтобы опровергнуть его. Они объясняют сухие формальности, но есть гораздо более простой ответ на этот зашоренный вопросОтветы:
ИМХО, существующие ответы плохо справляются с объяснением «почему» этого - слишком много внимания уделяется повторению того, какое поведение является допустимым. «Модификаторы доступа работают на уровне класса, а не на уровне объекта». - Да, но почему?
Общая концепция здесь заключается в том, что программисты, проектирующие, пишущие и поддерживающие класс, должны понимать желаемую инкапсуляцию объектно-ориентированного программирования и уполномочены координировать ее реализацию. Итак, если вы пишете
class X
, вы кодируете не только то, как отдельныйX x
объект может использоваться кодом с доступом к нему, но и то, как:X
объекты взаимодействуют, чтобы обеспечить предполагаемое поведение, соблюдая пост-условия и инварианты вашего дизайна.Это не просто конструктор копирования - очень многие операции могут включать два или более экземпляра вашего класса: если вы сравниваете, добавляете / умножаете / делите, копируете, клонируете, присваиваете и т. Д., То часто бывает, что вы либо просто должен иметь доступ к частным и / или защищенным данным в другом объекте, либо он должен обеспечивать более простую, быструю или в целом лучшую реализацию функций.
В частности, эти операции могут захотеть воспользоваться привилегированным доступом для выполнения таких действий, как:
shared_ptr
ссылки на данные и т. д.auto_ptr<>
"перемещает" право собственности на строящийся объектunordered_map
членом , но публично только разоблачитьbegin()
иend()
итераторы - с прямым доступом кsize()
вам моглиreserve
емкость для быстрого копирования; еще хуже , если они только разоблачитьat()
иinsert()
в противном случаеthrow
....источник
this == other
каждый раз, когда вы обращаетесь кother.x
которому, вы должны, если бы модификаторы доступа работали на уровне объекта, потребовало бы огромных накладных расходов во время выполнения .this == other
каждый раз, когда вы обращаетесьother.x
» - упускает суть - если бы онother.x
был принят только во время выполнения, когда эквивалентенthis.x
,other.x
в первую очередь не было бы много записи указателя ; компилятор также может заставить вас писатьif (this == other) ...this.x...
то, что вы собираетесь делать. Ваша концепция «удобства (даже больше, если частные переменные были общедоступными)» также упускает из виду суть - способ, которым определены в Стандарте, достаточно ограничен, чтобы обеспечить правильную инкапсуляцию, но не излишне неудобен.Модификаторы доступа работают на уровне класса , а не на уровне объекта .
То есть два объекта одного класса могут обращаться к личным данным друг друга.
Зачем:
В первую очередь за счет экономичности. Было бы немаловажными накладными расходами во время выполнения проверять,
this == other
каждый раз, когда вы обращаетесь кother.x
которому, вам придется, если модификаторы доступа работают на уровне объекта.Это также является своего рода семантически логичным, если вы думаете об этом с точки зрения области видимости: «Насколько большую часть кода мне нужно учитывать при изменении частной переменной?» - Вам нужно иметь в виду код всего класса, и он ортогонален тому, какие объекты существуют во время выполнения.
И это невероятно удобно при написании конструкторов копирования и операторов присваивания.
источник
Вы можете получить доступ к закрытым членам класса изнутри класса, даже к членам другого экземпляра.
источник
Чтобы понять ответ, я хотел бы напомнить вам несколько концепций.
this
указатель передается каждой функции при вызове.Теперь это из-за
this
указателю функция может находить переменные этого конкретного экземпляра. независимо от того, является ли он частным или публичным. к нему можно получить доступ внутри этой функции. Теперь, если мы передадим указатель на другой объект того же класса. используя этот второй указатель, мы сможем получить доступ к закрытым членам.Надеюсь, что это ответ на ваш вопрос.
источник
Конструктор копирования является функцией-членом класса и поэтому имеет доступ к членам данных класса, даже к тем, которые объявлены как «частные».
источник