Спецификаторы доступа C ++ - PullRequest
1 голос
/ 07 февраля 2011

Я просто хочу убедиться, что у меня есть представление о публичном и частном праве.

Что касается спецификатора частного доступа, значит ли это:

  • Только доступ внутри класса
  • Невозможно получить доступ из объекта класса, если только нет открытых методов класса, которые можно использовать для доступа к ним ( Могут ли другие объекты использовать эти открытые функции? )
  • Никакой другой объект не может получить к ним доступ

И для общего доступа:

  • Доступ к объекту класса
  • Доступ к любому другому объектуобъект

Это верно?

Ответы [ 5 ]

4 голосов
/ 07 февраля 2011

личное : к нему могут получить доступ только функции-члены и друзья класса.
public : Доступ к нему возможен везде, где объект имеет область действия.


Отвечая на вопросы -

частный

  1. Да
  2. Да. (Могут ли другие объекты использовать эти открытые функции? Без наличия отношений класса один объект класса не может общаться с членами другого.)
  3. Друзья имеют доступ к закрытым членам класса. Ответ зависит от того, есть у вас друзья или нет.

1024 * общественное *:

  1. Да
  2. Зависит от того, имеет ли объект иерархические отношения с классом члена, к которому вы пытаетесь получить доступ.
2 голосов
/ 07 февраля 2011

Я думаю, что для начала существует проблема со словарем.

В C ++ (и большинстве языков) class - это type. Вы можете думать об этом как о проекте по созданию чего-то.

  • описывает атрибуты, которые содержатся
  • описывает методы работы с этими атрибутами
  • описывает ограничения, которые применяются: это «доступность»

object создается путем создания экземпляра класса, т. Е. Построения того, что описано в проекте. Это более или менее набор атрибутов. У вас может быть несколько объектов одного класса, как у вас может быть несколько домов одного и того же плана: обратите внимание, что их физическое местоположение отличается по очевидным причинам:)

Теперь перейдем к доступности. Существует 3 типичных уровня доступности: public, protected и private.

  • public, как и ожидалось, означает, что каждому предоставлен доступ к атрибутам или методам
  • protected несколько менее тривиально. Это означает, что только объект или его дочерние элементы могут получить доступ к атрибутам (плохая идея *) или методам. (Плюс в C ++ friend с)
  • private означает, что только объекты этого класса (а не их дочерние элементы) могут иметь доступ к атрибутам или методам (плюс, в C ++, friend s)

Примечание: независимо от уровня доступности, объект имеет неограниченный доступ ко всем атрибутам и методам любого объекта того же класса.

(*) Несмотря на то, что он появляется время от времени, использование атрибутов protected обычно не рекомендуется. Смысл инкапсуляции в том, чтобы скрыть детали не только ради этого, но и потому, что, точно контролируя, кто может получить доступ к данным, мы можем гарантировать, что класс поддерживает свои инварианты (простой пример, массив где вы будете хранить размер отдельно, вы должны убедиться, что «размер» действительно всегда представляет количество элементов в массиве). Примечание: это ограничение не применяется, когда вы можете запечатать иерархию, как, например, в C #.

2 голосов
/ 07 февраля 2011

Закрытые члены могут быть доступны только функциям-членам и статическим функциям одного класса и его друзьямНе имеет значения, для какого объекта эта функция вызывается.Так что дело

class Foo
{
  private:
    void bar() {}
  public:
    void baz(Foo& var)
    {
      var.bar();
    }
}

совершенно законно.

1 голос
/ 07 февраля 2011

Это кажется правильным.Доступ к данным и функциям, помеченным как общедоступные, может быть осуществлен кем угодно.Доступ к данным и функциям, помеченным как закрытые, может получить только класс и его друзья.Однако функция-член класса может обращаться к данным с любым спецификатором доступа, поэтому открытая функция может читать и записывать частные элементы данных (это универсально используется в ООП).

0 голосов
/ 25 августа 2016

В c ++ данные и fn инкапсулированы как 1 единица. Мы начинаем программу с написания директивы препроцессора Затем объявление класса Затем следует объявление функции (fn), в котором мы также указываем модификатор доступа (открытый, закрытый или защищенный)

и, наконец, основная () программа.

Если мы объявим FN Приватный: доступ к данным внутри объекта класса возможен только с помощью fn, определенного в нем - (объект, который имеет данные и приватный fn)

Публично: к данным может обращаться любой fn

Защищено: аналогично частному, однако данные также могут быть доступны для подклассов, которые наследуют свойства другого класса.

Пример, если класс A наследуется от класса B, тогда A является подклассом B.

...