Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Атрибути доступу як засіб підвищення надійності програмування



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

Еще одной проблемой является часто возникающая необходимость изоляции внешних объектов от особенностей внутренней реализации класса. Для сторонних пользователей класса можно ограничиться доступом только к той части класса, которая представляет его интерфейс. Это дает знание того, что представляют собой основные данные объекта и какими функциями класса и как именно можно пользоваться при программировании операций с объектами класса. А внутренняя реализация класса это дело его разработчика.

Указанные проблемы решаются с помощью атрибутов доступа. Любой компонент класса или функция могут быть объявлены с одним из трех атрибутов доступа:

private - компонент может быть использован только функцией текущего класса или дружественной friend-функцией. Этот атрибут является умолчанием для класса, объявляемого с помощью служебного слова class;

protected - по сравнению с предыдущим атрибутом, доступ расширяется за счет собственных функций и friend-функций производных классов;

public - доступ к компоненту возможен из любой функции, как внутренней, так и внешней по отношению к классу. Этот атрибут является умолчанием для класса, объявляемого с помощью служебного слова struct.

Текущий атрибут в объявлении класса действует до следующего атрибута.

Отметим еще раз, что по умолчанию все компоненты класса, объявляемого с помощью служебного слова class имеют атрибут private, а компоненты класса, объявленного как struct, имеют атрибут public. Рассмотрим в качестве примера класс Vector:

class Vector

{ float x,y,z;

float len() { return sqrt(x*x+y*y+z*z); }

};

Таким классом пользоваться невозможно, т.к. все его компоненты, включая функцию len, недоступны извне. Более правильным будет такое определение класса:

class Vector

{ float x,y,z;

public:

float len();

};

Теперь компоненты класса доступны, но только для вычисления длины вектора через функцию класса len().

На статические компоненты атрибуты доступа действуют точно также, как и на не статические.

Дружественные функции

Дружественной называют функцию, внешнюю по отношению к некоторому классу, но, тем не менее, имеющую такие же права доступа, как и функция - член класса. Для того, чтобы сделать функцию дружественной к некоторому классу, необходимо в этом классе записать прототип этой функции с использованием служебного слова friend. Пусть, к примеру, имеется внешняя функция fout, которая должна выводить значение типа Vector на экран:

void fout(FILE* out, Vector A)

{ fprintf(out,"%f %f %f \n",A.x, A.y, A.z);

}

Для того чтобы эта функция успешно работала, необходимо дополнить класс Vector следующим образом:

class Vector

{ float x,y,z;

public:

float len();

friend void fout(FILE*, Vector);

};

Строка

friend void fout(FILE*, Vector);

объявляет функцию fout дружественной по отношению к классу Vector. Такая функция имеет доступ ко всем (в том числе private) компонентам класса Vector.

Можно объявить другом не только функцию, но и целый класс. В следующем примере класс Matrix объявлен дружественным к классу Vector:

class Vector

{ float x,y,z;

friend Matrix;

};

Теперь все функции класса Matrix имеют доступ ко всем компонентам класса Vector.

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

 

Можно объявить другом не только функцию, но и целый класс. В следующем примере класс Matrix объявлен дружественным к классу Vector:

class Vector

{ float x,y,z;

friend Matrix;

};

Теперь все функции класса Matrix имеют доступ ко всем компонентам класса Vector.

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

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.