Модификаторы доступа
Ранее мы говорили про классы и упоминали модификаторы доступа, также мы говорили, что можно от класса унаследовать все или отдельные поля и методы, сейчас поговорим об этом подробнее.
Модификаторы доступа нужны для ограничения доступа пользователя (стороннего программиста) в ваш класс.
Например в предыдущем примере мы могли спокойно обращаться и изменять поля имени и возраста, что в принципе не очень корректно, т.к. могут вызываться ошибки (случайные или преднамеренные), для разграничения прав доступа и используются модификаторы доступа:
Модификатор доступа public:
Доступ разрешен всем как внутри класса например(this->age), так и снаружи (доступ через объект класса, например c_Person1.age=30;)
Модификатор доступа private:
Доступ разрешен всем только внутри класса например(this->age),
При попытке обратится снаружи (доступ через объект класса, например c_Person1.age=30;) на этапе компиляции возникнет ошибка.
Модификатор доступа protected:
Доступ разрешен всем внутри класса например(this->age), а также внутри классов – наследников.
Примечание: модификатор доступа protected будет более понятен после темы наследование классов
Создадим класс person с 3 полями возраст, рост и имя
class Person
{
public:
//Методы класса
void setInfo(string Name,unsigned int height) //функция "сеттер"
{
this->Name=Name;
this->height=height;
}
unsigned int getInfo_height() //функция "геттер"
{
return (this->height);
}
//поля класса
unsigned int age; //можем обращаться и внутри и снаружи класса
private:
string Name; //можем обращаться только внутри класса
protected:
unsigned int height; //можем обращаться внутри класса и внутри классов-потомков
};
//класс потомок
class Child : public Person //тут используется 2 модификатор доступа (обычно он public) для него есть специальная таблица
{
//свои методы и поля
this->height=140;
};
Person c_Person1;
c_Person1.age=30;
c_Person1.Name="Vasya"; //ДАННЫЙ КОД НЕ скомпилируется, т.к. модификатор доступа private
c_Person1.height=25; //ДАННЫЙ КОД НЕ скомпилируется, т.к. модификатор доступа protected
c_Person1.GetInfo();
//Создадим класс-наследник
Child c_Child;
c_Child.height=150; //ДАННЫЙ КОД НЕ скомпилируется, т.к. модификатор доступа protected
c_Child.getInfo(); //вызовем функцию GetInfo
Как видно из фрагмента кода, извне и снаружи мы можем поменять только поле age, т.к. у него модификатор доступа public, также мы можем вызвать public методы setInfo и getInfo_height.
Доступ к полю height возможен внутри класса и через класс наследник Child (this->height=140;;)
Доступ к полю Name возможен только внутри класса Person.
Возникает вопрос — зачем нужны поля класса, доступа к которым извне у нас нет? и как их изменить?
Для этого создаются методы get и set (называются геттер и сеттер)
С помощью set них мы можем получить данные, проверить их (например что имя — это действительно имя а не цифры) и только потом записать в поля класса.
Метод get позволяет получить к полю класса извне (но позволяет ограничить доступ изменения), как например функция getInfo_height() — мы можем получить вес по значению (цифру), но не получим доступа к памяти, где эта переменная хранится.
Модификаторы доступа при наследовании:
Забегая вперед – при создании класса- наследника class Child : public Person
мы указывали модификатор доступа, он показывает как унаследовать один класс от другого, в таблице ниже представлены изменения модификаторов доступа класса в зависимости от модификатора доступа при наследовании.

Так например при наследовании class Child : public Person все модификаторы сохраняют свое значение и мы имеем доступ к public и protected полям и методам.
При private наследовании все private-члены остаются недоступными, а protected- и public-члены становятся private в дочернем классе.)
//———————————————————-
ВАЖНОЕ ПРИМЕЧАНИЕ:
При помощи ключевого слова friend можно предоставить доступ ко всем полям класса другой функции или классу