20. С++ Модификаторы доступа

Модификаторы доступа

Ранее мы говорили про классы и упоминали модификаторы доступа, также мы говорили, что можно от класса унаследовать все или отдельные поля и методы, сейчас поговорим об этом подробнее.

Модификаторы доступа нужны для ограничения доступа пользователя (стороннего программиста) в ваш класс.
Например в предыдущем примере мы могли спокойно обращаться и изменять поля имени и возраста, что в принципе не очень корректно, т.к. могут вызываться ошибки (случайные или преднамеренные), для разграничения прав доступа и используются модификаторы доступа:

Модификатор доступа 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 можно предоставить доступ ко всем полям класса другой функции или классу

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *