Реализация принципа инкапсуляции ограничением области видимости компонент

У рассмотренного выше класса array есть еще один существенный недостаток – все компоненты этого класса являются общедоступными. Это означает, что к любому компонентному данному объекта можно обратиться, например, из функции main(), минуя вызов методов класса.

//Листинг 9. Нарушение принципа инкапсуляции

main()

{ array m(10);

delete m.mas;

for(int i=0;i<m.n;i++)

cin>>m.mas[I];

}

Таким образом, проигнорировав интерфейс объекта, программист может работать с компонентными данными, и целостность объекта не может быть гарантирована. Выход из создавшегося положения уже известен – необходимо выделить в объекте интерфейс и внутреннюю реализацию и запретить доступ из окружения объекта к компонентам, составляющим его внутреннюю реализацию.

Для каждого компонента класса устанавливается область видимости либо явно - указанием уровня доступа одним из ключевых слов public, protected или private с двоеточием, либо неявно - по умолчанию. Указание области видимости относится ко всем последующим компонентам класса, пока не встретится указание другой области видимости. Область видимости public разрешает доступ к компонентам класса из любого места программы, в котором известна переменная этого класса. Такие компоненты называются общедоступными. Область видимости private разрешает доступ к компонентам класса только из методов этого класса. Компоненты, определенные с такой областью видимости, называются частными. Область видимости protected определяется для защищенных компонент, она имеет смысл только в иерархической системе классов и разрешает доступ к компонентам этой области из методов производного класса. В теле класса каждое из ключевых слов public, protected, private может указываться неоднократно, то есть в классе может быть два и более блока общедоступных компонент, частных компонент, защищенных компонент. По умолчанию для всех компонент класса типа struct принимается область видимости public, но можно явно задавать и другие уровни доступа, область видимости к компонентам класса типа class по умолчанию private, явно можно определять и другие уровни, для класса типа union область видимости public и не может быть изменен.

// Определение областей видимости компонент для класса,

// объявленного через struct

struct MyClass

{ … //здесь определяются общедоступные компоненты класса

private:

… //здесь определяются частные компоненты класса

protected:

… //здесь определяются защищенные компоненты класса

public:

… //здесь определяются общедоступные компоненты класса

};

//Определение областей видимости компонент для класса,

//объявленного через class

class MyClass

{ … //здесь определяются частные компоненты класса

protected:

… //здесь определяются защищенные компоненты класса

public:

… //здесь определяются общедоступные компоненты класса

private:

… //здесь определяются частные компоненты класса

};

Изменим тело класса array так, чтобы он полностью удовлетворял требованиям принципа инкапсуляции.

//Листинг 10.Переопределение класса «массив целых чисел» с

//ограничением прав доступа к внутренней реализации объекта

class array

{ int *mas, n;

public:

array(int k) {…} //конструктор и деструктор должны быть общедоступными.

~array() {…} // Иначе нельзя будет создать и уничтожить объект класса

ReadMas() {…}

WriteMas(){…}

};

main()

{array m(5);

m.n=10; //Ошибка!!! Компонент n частный и доступ к нему

//из функции main запрещен

m.ReadMas(); // Метод RadMas – общедоступный, что

//допускает обращение к нему из внешней функции main()

}

После определения класса приведенным в последнем примере способом, обращение к компонентам n и mas разрешено только из методов класса. Функция main() не является методом класса и обращаться в ней к частным компонентам класса запрещено, что и отмечено в примере. Попытка откомпилировать данный пример приведет к ошибке на этапе компиляции программы «array::n is not accessible»

В языке С++ существует возможность обращения к частным компонентам класса из функций, не являющихся методом данного класса, такие функции называются дружественными (friend).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: